Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
35.71% covered (danger)
35.71%
893 / 2501
10.42% covered (danger)
10.42%
5 / 48
CRAP
0.00% covered (danger)
0.00%
0 / 1
AppController
35.63% covered (danger)
35.63%
890 / 2498
10.42% covered (danger)
10.42%
5 / 48
189497.96
0.00% covered (danger)
0.00%
0 / 1
 processSGF
98.11% covered (success)
98.11%
52 / 53
0.00% covered (danger)
0.00%
0 / 1
15
 xFlip
75.00% covered (warning)
75.00%
3 / 4
0.00% covered (danger)
0.00%
0 / 1
2.06
 yFlip
75.00% covered (warning)
75.00%
3 / 4
0.00% covered (danger)
0.00%
0 / 1
2.06
 getInitialPositionEnd
100.00% covered (success)
100.00%
8 / 8
100.00% covered (success)
100.00%
1 / 1
3
 getInitialPosition
100.00% covered (success)
100.00%
20 / 20
100.00% covered (success)
100.00%
1 / 1
6
 getInvisibleSets
0.00% covered (danger)
0.00%
0 / 8
0.00% covered (danger)
0.00%
0 / 1
12
 getDeletedSets
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
12
 startPageUpdate
88.89% covered (warning)
88.89%
16 / 18
0.00% covered (danger)
0.00%
0 / 1
5.03
 uotd
0.00% covered (danger)
0.00%
0 / 157
0.00% covered (danger)
0.00%
0 / 1
2070
 deleteUnusedStatuses
0.00% covered (danger)
0.00%
0 / 40
0.00% covered (danger)
0.00%
0 / 1
72
 saveSolvedNumber
78.12% covered (warning)
78.12%
25 / 32
0.00% covered (danger)
0.00%
0 / 1
13.51
 resetUserElos
0.00% covered (danger)
0.00%
0 / 14
0.00% covered (danger)
0.00%
0 / 1
12
 handleContribution
52.94% covered (warning)
52.94%
9 / 17
0.00% covered (danger)
0.00%
0 / 1
2.42
 getAllTags
96.55% covered (success)
96.55%
28 / 29
0.00% covered (danger)
0.00%
0 / 1
7
 getNewTsumego
0.00% covered (danger)
0.00%
0 / 13
0.00% covered (danger)
0.00%
0 / 1
12
 publishSingle
0.00% covered (danger)
0.00%
0 / 45
0.00% covered (danger)
0.00%
0 / 1
30
 getTsumegoOfTheDay
0.00% covered (danger)
0.00%
0 / 104
0.00% covered (danger)
0.00%
0 / 1
1190
 ratingMatch
0.00% covered (danger)
0.00%
0 / 62
0.00% covered (danger)
0.00%
0 / 1
992
 rating2
0.00% covered (danger)
0.00%
0 / 22
0.00% covered (danger)
0.00%
0 / 1
132
 encrypt
100.00% covered (success)
100.00%
6 / 6
100.00% covered (success)
100.00%
1 / 1
1
 decrypt
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
2
 checkPictureLarge
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
12
 checkPicture
66.67% covered (warning)
66.67%
2 / 3
0.00% covered (danger)
0.00%
0 / 1
3.33
 getTsumegoRankx
0.00% covered (danger)
0.00%
0 / 42
0.00% covered (danger)
0.00%
0 / 1
506
 adjustElo
0.00% covered (danger)
0.00%
0 / 23
0.00% covered (danger)
0.00%
0 / 1
132
 getTsumegoRankVal
0.00% covered (danger)
0.00%
0 / 41
0.00% covered (danger)
0.00%
0 / 1
506
 getTsumegoRankMax
0.00% covered (danger)
0.00%
0 / 41
0.00% covered (danger)
0.00%
0 / 1
506
 saveDanSolveCondition
100.00% covered (success)
100.00%
18 / 18
100.00% covered (success)
100.00%
1 / 1
7
 updateSprintCondition
94.44% covered (success)
94.44%
17 / 18
0.00% covered (danger)
0.00%
0 / 1
4.00
 updateGoldenCondition
94.12% covered (success)
94.12%
16 / 17
0.00% covered (danger)
0.00%
0 / 1
3.00
 setPotionCondition
0.00% covered (danger)
0.00%
0 / 14
0.00% covered (danger)
0.00%
0 / 1
6
 updateGems
3.85% covered (danger)
3.85%
4 / 104
0.00% covered (danger)
0.00%
0 / 1
2183.48
 checkProblemNumberAchievements
42.39% covered (danger)
42.39%
39 / 92
0.00% covered (danger)
0.00%
0 / 1
166.38
 checkDanSolveAchievements
46.82% covered (danger)
46.82%
81 / 173
0.00% covered (danger)
0.00%
0 / 1
545.62
 checkForLocked
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
20
 checkNoErrorAchievements
50.77% covered (warning)
50.77%
33 / 65
0.00% covered (danger)
0.00%
0 / 1
51.48
 checkTimeModeAchievements
35.40% covered (danger)
35.40%
40 / 113
0.00% covered (danger)
0.00%
0 / 1
2273.83
 checkRatingAchievements
54.44% covered (warning)
54.44%
49 / 90
0.00% covered (danger)
0.00%
0 / 1
95.92
 checkLevelAchievements
72.22% covered (warning)
72.22%
65 / 90
0.00% covered (danger)
0.00%
0 / 1
42.63
 checkSetCompletedAchievements
19.72% covered (danger)
19.72%
14 / 71
0.00% covered (danger)
0.00%
0 / 1
166.54
 setAchievementSpecial
0.00% covered (danger)
0.00%
0 / 184
0.00% covered (danger)
0.00%
0 / 1
4160
 checkSetAchievements
18.10% covered (danger)
18.10%
40 / 221
0.00% covered (danger)
0.00%
0 / 1
2533.09
 getXPJump
0.00% covered (danger)
0.00%
0 / 15
0.00% covered (danger)
0.00%
0 / 1
72
 updateXP
60.00% covered (warning)
60.00%
6 / 10
0.00% covered (danger)
0.00%
0 / 1
3.58
 getPartitionRange
0.00% covered (danger)
0.00%
0 / 22
0.00% covered (danger)
0.00%
0 / 1
56
 handleSearchSettings
100.00% covered (success)
100.00%
13 / 13
100.00% covered (success)
100.00%
1 / 1
2
 signIn
83.33% covered (warning)
83.33%
5 / 6
0.00% covered (danger)
0.00%
0 / 1
2.02
 beforeFilter
83.23% covered (warning)
83.23%
278 / 334
0.00% covered (danger)
0.00%
0 / 1
94.76
 afterFilter
n/a
0 / 0
n/a
0 / 0
1
1<?php
2
3App::uses('Auth', 'Utility');
4App::uses('TsumegoFilters', 'Utility');
5App::uses('TimeMode', 'Utility');
6
7class AppController extends Controller {
8    public $viewClass = 'App';
9
10    public $components = [
11        'Session',
12        //'DebugKit.Toolbar',
13        'Flash',
14        'PlayResultProcessor'
15    ];
16
17    public static function processSGF($sgf) {
18        $aw = strpos($sgf, 'AW');
19        $ab = strpos($sgf, 'AB');
20        $boardSizePos = strpos($sgf, 'SZ');
21        $boardSize = 19;
22        $sgfArr = str_split($sgf);
23        if ($boardSizePos !== false) {
24            $boardSize = $sgfArr[$boardSizePos + 3] . '' . $sgfArr[$boardSizePos + 4];
25        }
26        if (substr($boardSize, 1) == ']') {
27            $boardSize = substr($boardSize, 0, 1);
28        }
29
30        $black = AppController::getInitialPosition($ab, $sgfArr, 'x');
31        $white = AppController::getInitialPosition($aw, $sgfArr, 'o');
32        $stones = array_merge($black, $white);
33
34        $board = [];
35        for ($i = 0; $i < 19; $i++) {
36            $board[$i] = [];
37            for ($j = 0; $j < 19; $j++) {
38                $board[$i][$j] = '-';
39            }
40        }
41        $lowestX = 18;
42        $lowestY = 18;
43        $highestX = 0;
44        $highestY = 0;
45        $stonesCount = count($stones);
46        for ($i = 0; $i < $stonesCount; $i++) {
47            if ($stones[$i][0] < $lowestX) {
48                $lowestX = $stones[$i][0];
49            }
50            if ($stones[$i][0] > $highestX) {
51                $highestX = $stones[$i][0];
52            }
53            if ($stones[$i][1] < $lowestY) {
54                $lowestY = $stones[$i][1];
55            }
56            if ($stones[$i][1] > $highestY) {
57                $highestY = $stones[$i][1];
58            }
59        }
60        if (18 - $lowestX < $lowestX) {
61            $stones = AppController::xFlip($stones);
62        }
63        if (18 - $lowestY < $lowestY) {
64            $stones = AppController::yFlip($stones);
65        }
66        $highestX = 0;
67        $highestY = 0;
68        $stonesCount = count($stones);
69        for ($i = 0; $i < $stonesCount; $i++) {
70            if ($stones[$i][0] > $highestX) {
71                $highestX = $stones[$i][0];
72            }
73            if ($stones[$i][1] > $highestY) {
74                $highestY = $stones[$i][1];
75            }
76            $board[$stones[$i][0]][$stones[$i][1]] = $stones[$i][2];
77        }
78        $tInfo = [];
79        $tInfo[0] = $highestX;
80        $tInfo[1] = $highestY;
81        $arr = [];
82        $arr[0] = $board;
83        $arr[1] = $stones;
84        $arr[2] = $tInfo;
85        $arr[3] = $boardSize;
86
87        return $arr;
88    }
89
90    public static function xFlip($stones) {
91        $stonesCount = count($stones);
92        for ($i = 0; $i < $stonesCount; $i++) {
93            $stones[$i][0] = 18 - $stones[$i][0];
94        }
95
96        return $stones;
97    }
98
99    public static function yFlip($stones) {
100        $stonesCount = count($stones);
101        for ($i = 0; $i < $stonesCount; $i++) {
102            $stones[$i][1] = 18 - $stones[$i][1];
103        }
104
105        return $stones;
106    }
107
108    public static function getInitialPositionEnd($pos, $sgfArr) {
109        $endCondition = 0;
110        $currentPos1 = $pos + 2;
111        $currentPos2 = $pos + 5;
112        while ($sgfArr[$currentPos1] == '[' && $sgfArr[$currentPos2] == ']') {
113            $endCondition = $currentPos2;
114            $currentPos1 += 4;
115            $currentPos2 += 4;
116        }
117
118        return $endCondition;
119    }
120
121    public static function getInitialPosition($pos, $sgfArr, $color) {
122        $arr = [];
123        $end = AppController::getInitialPositionEnd($pos, $sgfArr);
124        for ($i = $pos + 2; $i < $end; $i++) {
125            if ($sgfArr[$i] != '[' && $sgfArr[$i] != ']') {
126                array_push($arr, strtolower($sgfArr[$i]));
127            }
128        }
129        $alphabet = array_flip(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']);
130        $xy = true;
131        $arr2 = [];
132        $c = 0;
133        $arrCount = count($arr);
134        for ($i = 0; $i < $arrCount; $i++) {
135            $arr[$i] = $alphabet[$arr[$i]];
136            if ($xy) {
137                $arr2[$c] = [];
138                $arr2[$c][0] = $arr[$i];
139            } else {
140                $arr2[$c][1] = $arr[$i];
141                $arr2[$c][2] = $color;
142                $c++;
143            }
144            $xy = !$xy;
145        }
146
147        return $arr2;
148    }
149
150    protected function getInvisibleSets() {
151        $this->loadModel('Set');
152        $invisibleSets = [];
153        $in = $this->Set->find('all', ['conditions' => ['public' => 0]]);
154        if (!$in) {
155            $in = [];
156        }
157        foreach ($in as $item) {
158            $invisibleSets[] = $item['Set']['id'];
159        }
160
161        return $invisibleSets;
162    }
163
164    protected function getDeletedSets() {
165        $dSets = [];
166        $de = $this->Set->find('all', ['conditions' => ['public' => -1]]);
167        if (!$de) {
168            $de = [];
169        }
170        foreach ($de as $item) {
171            $dSets[] = $item['Set']['id'];
172        }
173
174        return $dSets;
175    }
176
177    /**
178     * @return void
179     */
180    public static function startPageUpdate() {
181        $str = '';
182        $latest = ClassRegistry::init('AchievementStatus')->find('all', ['limit' => 7, 'order' => 'created DESC']);
183        if (!$latest) {
184            $latest = [];
185        }
186        $latestCount = count($latest);
187        for ($i = 0; $i < $latestCount; $i++) {
188            $a = ClassRegistry::init('Achievement')->findById($latest[$i]['AchievementStatus']['achievement_id']);
189            $u = ClassRegistry::init('User')->findById($latest[$i]['AchievementStatus']['user_id']);
190            if (substr($u['User']['name'], 0, 3) == 'g__' && $u['User']['external_id'] != null) {
191                $startPageUser = AppController::checkPicture($u);
192            } else {
193                $startPageUser = $u['User']['name'];
194            }
195            $latest[$i]['AchievementStatus']['name'] = $a['Achievement']['name'];
196            $latest[$i]['AchievementStatus']['color'] = $a['Achievement']['color'];
197            $latest[$i]['AchievementStatus']['image'] = $a['Achievement']['image'];
198            $latest[$i]['AchievementStatus']['user'] = $startPageUser;
199            $str .= '<div class="quote1"><div class="quote1a"><a href="/achievements/view/' . $a['Achievement']['id'] . '"><img src="/img/' . $a['Achievement']['image'] . '.png" width="34px"></a></div>';
200            $str .= '<div class="quote1b">Achievement gained by ' . $startPageUser . ':<br><div class=""><b>' . $a['Achievement']['name'] . '</b></div></div></div>';
201        }
202        file_put_contents('mainPageAjax.txt', $str);
203    }
204
205    /**
206     * @return void
207     */
208    protected function uotd() { //routine1
209        $this->loadModel('User');
210        $this->loadModel('DayRecord');
211        $this->loadModel('TsumegoAttempt');
212        $this->loadModel('Achievement');
213        $this->loadModel('AchievementCondition');
214        $today = date('Y-m-d');
215        $ux2 = $this->User->find('all', [
216            'limit' => '8',
217            'order' => 'reuse3 DESC',
218            'conditions' => [
219                'NOT' => ['id' => [33]],
220            ],
221        ]);
222        if (!$ux2) {
223            $ux2 = [];
224        }
225        $last = $this->DayRecord->find('all', ['limit' => '7', 'order' => 'date DESC']);
226        if (!$last) {
227            $last = [];
228        }
229        $lastUotds = [];
230        $lastUsers = [];
231        foreach ($last as $item) {
232            $lastUotds[] = $item['DayRecord']['user_id'];
233        }
234        foreach ($ux2 as $item) {
235            $lastUsers[] = $item['User']['id'];
236        }
237        $resultUser = 72;
238        $lastUsersCount = count($lastUsers);
239        for ($i = 0; $i < $lastUsersCount; $i++) {
240            $foundUser = false;
241            $lastUotdsCount = count($lastUotds);
242            for ($j = 0; $j < $lastUotdsCount; $j++) {
243                if ($lastUsers[$i] == $lastUotds[$j]) {
244                    $foundUser = true;
245                }
246            }
247            if (!$foundUser) {
248                $resultUser = $lastUsers[$i];
249
250                break;
251            }
252        }
253        $ux = $this->User->findById($resultUser);
254
255        $recentlyUsed = [];
256        $d = 1;
257        while ($d <= 10) {
258            $ru = $this->DayRecord->find('first', ['conditions' => ['date' => date('Y-m-d', strtotime('-' . $d . ' days'))]]);
259            if ($ru) {
260                array_push($recentlyUsed, $ru);
261            }
262            $d++;
263        }
264        $currentQuote = 'q01';
265        $newQuote = 'q01';
266        $quoteChosen = false;
267        while (!$quoteChosen) {
268            $newQuote = rand(1, 45);
269            if ($newQuote < 10) {
270                $newQuote = 'q0' . $newQuote;
271            } else {
272                $newQuote = 'q' . $newQuote;
273            }
274
275            $f = false;
276            $recentlyUsedCount = count($recentlyUsed);
277            for ($i = 0; $i < $recentlyUsedCount; $i++) {
278                if ($newQuote == $recentlyUsed[$i]['DayRecord']['quote']) {
279                    $f = true;
280                }
281            }
282            if (!$f) {
283                $quoteChosen = true;
284            }
285        }
286        $currentQuote = $newQuote;
287        $dayUserRand = 1;
288        $uotdChosen = false;
289        while (!$uotdChosen) {
290            $dayUserRand = rand(1, 39);
291            $f = false;
292            $recentlyUsedCount = count($recentlyUsed);
293            for ($i = 0; $i < $recentlyUsedCount; $i++) {
294                if ($dayUserRand == $recentlyUsed[$i]['DayRecord']['userbg']) {
295                    $f = true;
296                }
297            }
298            if (!$f) {
299                $uotdChosen = true;
300            }
301        }
302        $activity = $this->TsumegoAttempt->find('all', ['limit' => 40000, 'conditions' => ['DATE(TsumegoAttempt.updated)' => date('Y-m-d', strtotime('yesterday'))]]);
303        if (!$activity) {
304            $activity = [];
305        }
306        $visitedProblems = count($activity);
307
308        //how many users today
309        $usersNum = [];
310        $activity = $this->User->find('all', ['limit' => 400, 'order' => 'created DESC']);
311        if (!$activity) {
312            $activity = [];
313        }
314        $activityCount = count($activity);
315        for ($i = 0; $i < $activityCount; $i++) {
316            $a = new DateTime($activity[$i]['User']['created']);
317            if ($a->format('Y-m-d') == $today) {
318                array_push($usersNum, $activity[$i]['User']);
319            }
320        }
321        $gemRand1 = rand(0, 2);
322        $gemRand2 = rand(0, 2);
323        $gemRand3 = rand(0, 2);
324
325        $arch1 = ClassRegistry::init('Achievement')->findById(111);
326        if ($gemRand1 == 0) {
327            $arch1['Achievement']['description'] = 'Has a chance to trigger once a day on an easy ddk problem.';
328        } elseif ($gemRand1 == 1) {
329            $arch1['Achievement']['description'] = 'Has a chance to trigger once a day on a regular ddk problem.';
330        } elseif ($gemRand1 == 2) {
331            $arch1['Achievement']['description'] = 'Has a chance to trigger once a day on a difficult ddk problem.';
332        }
333        ClassRegistry::init('Achievement')->save($arch1);
334        $arch2 = ClassRegistry::init('Achievement')->findById(112);
335        if ($gemRand2 == 0) {
336            $arch2['Achievement']['description'] = 'Has a chance to trigger once a day on an easy sdk problem.';
337        } elseif ($gemRand2 == 1) {
338            $arch2['Achievement']['description'] = 'Has a chance to trigger once a day on a regular sdk problem.';
339        } elseif ($gemRand2 == 2) {
340            $arch2['Achievement']['description'] = 'Has a chance to trigger once a day on a difficult sdk problem.';
341        }
342        ClassRegistry::init('Achievement')->save($arch2);
343        $arch3 = ClassRegistry::init('Achievement')->findById(113);
344        if ($gemRand3 == 0) {
345            $arch3['Achievement']['description'] = 'Has a chance to trigger once a day on an easy dan problem.';
346        } elseif ($gemRand3 == 1) {
347            $arch3['Achievement']['description'] = 'Has a chance to trigger once a day on a regular dan problem.';
348        } elseif ($gemRand3 == 2) {
349            $arch3['Achievement']['description'] = 'Has a chance to trigger once a day on a difficult dan problem.';
350        }
351        ClassRegistry::init('Achievement')->save($arch3);
352
353        $this->DayRecord->create();
354        $dateUser = [];
355        $dateUser['DayRecord']['user_id'] = $ux['User']['id'];
356        $dateUser['DayRecord']['date'] = $today;
357        $dateUser['DayRecord']['solved'] = $ux['User']['reuse3'];
358        $dateUser['DayRecord']['quote'] = $currentQuote;
359        $dateUser['DayRecord']['userbg'] = $dayUserRand;
360        $dateUser['DayRecord']['tsumego'] = $this->getTsumegoOfTheDay();
361        $dateUser['DayRecord']['newTsumego'] = $this->getNewTsumego();
362        $dateUser['DayRecord']['usercount'] = count($usersNum);
363        $dateUser['DayRecord']['visitedproblems'] = $visitedProblems;
364        $dateUser['DayRecord']['gems'] = $gemRand1 . '-' . $gemRand2 . '-' . $gemRand3;
365        $dateUser['DayRecord']['gemCounter1'] = 0;
366        $dateUser['DayRecord']['gemCounter2'] = 0;
367        $dateUser['DayRecord']['gemCounter3'] = 0;
368        $this->DayRecord->save($dateUser);
369
370        ClassRegistry::init('AchievementCondition')->create();
371        $achievementCondition = [];
372        $achievementCondition['AchievementCondition']['user_id'] = $ux['User']['id'];
373        $achievementCondition['AchievementCondition']['set_id'] = 0;
374        $achievementCondition['AchievementCondition']['category'] = 'uotd';
375        $achievementCondition['AchievementCondition']['value'] = 1;
376        ClassRegistry::init('AchievementCondition')->save($achievementCondition);
377
378        //delete duplicated DayRecords
379        $dr = $this->DayRecord->find('all');
380        if (!$dr) {
381            $dr = [];
382        }
383        $duplicates = [];
384        $drCount = count($dr);
385        for ($i = 0; $i < $drCount; $i++) {
386            $alreadyFound = [];
387            for ($j = 0; $j < $drCount; $j++) {
388                if ($i != $j && $dr[$j]['DayRecord']['date'] == $dr[$i]['DayRecord']['date']) {
389                    $found = false;
390                    $alreadyFoundCount = count($alreadyFound);
391                    for ($k = 0; $k < $alreadyFoundCount; $k++) {
392                        if ($alreadyFound[$k]['DayRecord']['id'] == $dr[$i]['DayRecord']['id'] || $alreadyFound[$k]['DayRecord']['id'] == $dr[$j]['DayRecord']['id']) {
393                            $found = true;
394                        }
395                    }
396                    if (!$found) {
397                        array_push($duplicates, $dr[$i]['DayRecord']['date']);
398                        array_push($alreadyFound, $dr[$i]);
399                    }
400                }
401            }
402        }
403        $duplicates = array_count_values($duplicates);
404        foreach ($duplicates as $key => $value) {
405            while ($duplicates[$key] > 1) {
406                $drd = $this->DayRecord->find('first', ['conditions' => ['date' => $key]]);
407                if ($drd) {
408                    $this->DayRecord->delete($drd['DayRecord']['id']);
409                }
410                $duplicates[$key]--;
411            }
412        }
413    }
414
415    public static function deleteUnusedStatuses(int $uid): void {
416        $s = ClassRegistry::init('Set')->find('all', [
417            'conditions' => [
418                'OR' => [
419                    ['public' => 1],
420                    ['public' => 0],
421                ],
422            ],
423        ]) ?: [];
424        $ids = [];
425        $sCount = count($s);
426        for ($i = 0; $i < $sCount; $i++) {
427            $tSet = TsumegoUtil::collectTsumegosFromSet($s[$i]['Set']['id']);
428            foreach ($tSet as $item) {
429                $ids[] = $item['Tsumego']['id'];
430            }
431        }
432        $ut = ClassRegistry::init('TsumegoStatus')->find('all', [
433            'conditions' => [
434                'user_id' => $uid,
435                'NOT' => [
436                    'tsumego_id' => $ids,
437                ],
438            ],
439        ]);
440        if (!$ut) {
441            $ut = [];
442        }
443        $utCount = count($ut);
444        for ($i = 0; $i < $utCount; $i++) {
445            $test1 = ClassRegistry::init('Tsumego')->findById($ut[$i]['TsumegoStatus']['tsumego_id']);
446            $test2 = ClassRegistry::init('SetConnection')->find('first', ['conditions' => ['tsumego_id' => $test1['Tsumego']['id']]]);
447            if (!$test2) {
448                ClassRegistry::init('TsumegoStatus')->delete($ut[$i]['TsumegoStatus']['id']);
449
450                continue;
451            }
452            $test3 = ClassRegistry::init('Set')->find('first', [
453                'id' => $test2['SetConnection']['set_id'],
454                'OR' => [
455                    ['public' => 1],
456                    ['public' => 0],
457                ],
458            ]);
459            if ($test3 == null) {
460                ClassRegistry::init('TsumegoStatus')->delete($ut[$i]['TsumegoStatus']['id']);
461            }
462        }
463    }
464
465    protected function saveSolvedNumber($uid) {
466        $this->loadModel('User');
467        $this->loadModel('TsumegoStatus');
468        $this->loadModel('Set');
469        $this->loadModel('SetConnection');
470
471        $solvedUts2 = 0;
472        $tsumegos = $this->SetConnection->find('all');
473        if (!$tsumegos) {
474            $tsumegos = [];
475        }
476        $uts = $this->TsumegoStatus->find('all', ['order' => 'updated DESC', 'conditions' => ['user_id' => $uid]]);
477        if (!$uts) {
478            $uts = [];
479        }
480        $setKeys = [];
481        $setArray = $this->Set->find('all', ['conditions' => ['public' => 1]]);
482        if (!$setArray) {
483            $setArray = [];
484        }
485
486        $setArrayCount = count($setArray);
487        for ($i = 0; $i < $setArrayCount; $i++) {
488            $setKeys[$setArray[$i]['Set']['id']] = $setArray[$i]['Set']['id'];
489        }
490
491        $scs = [];
492        $tsumegosCount = count($tsumegos);
493        for ($j = 0; $j < $tsumegosCount; $j++) {
494            if (!isset($scs[$tsumegos[$j]['SetConnection']['tsumego_id']])) {
495                $scs[$tsumegos[$j]['SetConnection']['tsumego_id']] = 1;
496            } else {
497                $scs[$tsumegos[$j]['SetConnection']['tsumego_id']]++;
498            }
499        }
500        $utsCount = count($uts);
501        for ($j = 0; $j < $utsCount; $j++) {
502            if ($uts[$j]['TsumegoStatus']['status'] == 'S' || $uts[$j]['TsumegoStatus']['status'] == 'W' || $uts[$j]['TsumegoStatus']['status'] == 'C') {
503                if (isset($scs[$uts[$j]['TsumegoStatus']['tsumego_id']])) {
504                    $solvedUts2 += $scs[$uts[$j]['TsumegoStatus']['tsumego_id']];
505                }
506            }
507        }
508        Auth::getUser()['solved'] = $solvedUts2;
509        Auth::saveUser();
510
511        return $solvedUts2;
512    }
513
514    /**
515     * @return void
516     */
517    protected function resetUserElos() {
518        $this->loadModel('User');
519
520        $u = $this->User->find('all', [
521            'conditions' => [
522                'id >=' => 15000,
523                'id <=' => 19000,
524            ],
525        ]);
526        if (!$u) {
527            $u = [];
528        }
529
530        $uCount = count($u);
531        for ($i = 0; $i < $uCount; $i++) {
532            $u[$i]['User']['rating'] = 900;
533            $u[$i]['User']['solved2'] = 0;
534            $this->User->save($u[$i]);
535        }
536    }
537
538    /**
539     * @param int $uid User ID
540     * @param string $action Action type
541     *
542     * @return void
543     */
544    public static function handleContribution($uid, $action) {
545        $uc = ClassRegistry::init('UserContribution')->find('first', ['conditions' => ['user_id' => $uid]]);
546        if ($uc == null) {
547            $uc = [];
548            $uc['UserContribution']['user_id'] = $uid;
549            $uc['UserContribution']['added_tag'] = 0;
550            $uc['UserContribution']['created_tag'] = 0;
551            $uc['UserContribution']['made_proposal'] = 0;
552            $uc['UserContribution']['reviewed'] = 0;
553            $uc['UserContribution']['score'] = 0;
554            ClassRegistry::init('UserContribution')->create();
555        }
556        $uc['UserContribution'][$action] += 1;
557        $uc['UserContribution']['score']
558        = $uc['UserContribution']['added_tag']
559        + $uc['UserContribution']['created_tag'] * 3
560        + $uc['UserContribution']['made_proposal'] * 5
561        + $uc['UserContribution']['reviewed'] * 2;
562        ClassRegistry::init('UserContribution')->save($uc);
563    }
564
565    public static function getAllTags($not) {
566        $a = [];
567        $notApproved = ClassRegistry::init('TagName')->find('all', ['conditions' => ['approved' => 0]]);
568        if (!$notApproved) {
569            $notApproved = [];
570        }
571        $notCount = count($not);
572        for ($i = 0; $i < $notCount; $i++) {
573            array_push($a, $not[$i]['Tag']['tag_name_id']);
574        }
575        $notApprovedCount = count($notApproved);
576        for ($i = 0; $i < $notApprovedCount; $i++) {
577            array_push($a, $notApproved[$i]['TagName']['id']);
578        }
579        $tn = ClassRegistry::init('TagName')->find('all', [
580            'conditions' => [
581                'NOT' => ['id' => $a],
582            ],
583        ]);
584        if (!$tn) {
585            $tn = [];
586        }
587        $sorted = [];
588        $keys = [];
589        $tnCount = count($tn);
590        for ($i = 0; $i < $tnCount; $i++) {
591            array_push($sorted, $tn[$i]['TagName']['name']);
592            $keys[$tn[$i]['TagName']['name']] = $tn[$i];
593        }
594        sort($sorted);
595        $s2 = [];
596        $sortedCount = count($sorted);
597        for ($i = 0; $i < $sortedCount; $i++) {
598            array_push($s2, $keys[$sorted[$i]]);
599        }
600
601        return $s2;
602    }
603
604    protected function getNewTsumego() {
605        $this->loadModel('Schedule');
606        $date = date('Y-m-d', strtotime('today'));
607        $s = $this->Schedule->find('all', ['conditions' => ['date' => $date]]);
608        if (!$s) {
609            $s = [];
610        }
611        $id = 0;
612        $sCount = count($s);
613        for ($i = 0; $i < $sCount; $i++) {
614            $id = $this->publishSingle($s[$i]['Schedule']['tsumego_id'], $s[$i]['Schedule']['set_id'], $s[$i]['Schedule']['date']);
615            $s[$i]['Schedule']['tsumego_id'] = $id;
616            $s[$i]['Schedule']['published'] = 1;
617            $this->Schedule->save($s[$i]);
618        }
619
620        return $id;
621    }
622
623    protected function publishSingle($t = null, $to = null, $date = null) {
624        $this->loadModel('Tsumego');
625        $this->loadModel('Sgf');
626        $this->loadModel('SetConnection');
627        $this->loadModel('PublishDate');
628        $ts = $this->Tsumego->findById($t);
629
630        $id = $this->Tsumego->find('first', ['limit' => 1, 'order' => 'id DESC']);
631        if (!$id) {
632            return null;
633        }
634        $id = $id['Tsumego']['id'];
635        $id += 1;
636
637        $scT = $this->SetConnection->find('first', ['conditions' => ['tsumego_id' => $ts['Tsumego']['id']]]);
638        if ($scT != null) {
639            $scT['SetConnection']['set_id'] = $to;
640            $scT['SetConnection']['tsumego_id'] = $id;
641            $scT['SetConnection']['num'] = $ts['Tsumego']['num'];
642            $this->SetConnection->save($scT);
643        } else {
644            $scT = [];
645            $scT['SetConnection']['set_id'] = $to;
646            $scT['SetConnection']['tsumego_id'] = $id;
647            $scT['SetConnection']['num'] = $ts['Tsumego']['num'];
648            $this->SetConnection->create();
649            $this->SetConnection->save($scT);
650        }
651
652        $sid = $ts['Tsumego']['id'];
653        $ts['Tsumego']['id'] = $id;
654        $ts['Tsumego']['created'] = $date . ' 22:00:00';
655        $ts['Tsumego']['solved'] = 0;
656        $ts['Tsumego']['failed'] = 0;
657        $ts['Tsumego']['userWin'] = 0;
658        $ts['Tsumego']['userLoss'] = 0;
659        $this->Tsumego->create();
660        $this->Tsumego->save($ts);
661        $this->Tsumego->delete($sid);
662
663        $sgfs = $this->Sgf->find('all', ['conditions' => ['tsumego_id' => $t]]);
664        if (!$sgfs) {
665            $sgfs = [];
666        }
667        $sgfsCount = count($sgfs);
668        for ($i = 0; $i < $sgfsCount; $i++) {
669            $sgfs[$i]['Sgf']['tsumego_id'] = $id;
670            $this->Sgf->save($sgfs[$i]);
671        }
672        $x = [];
673        $x['PublishDate']['date'] = $date . ' 22:00:00';
674        $x['PublishDate']['tsumego_id'] = $id;
675        $this->PublishDate->create();
676        $this->PublishDate->save($x);
677
678        return $id;
679    }
680
681    protected function getTsumegoOfTheDay() {
682        $this->loadModel('TsumegoAttempt');
683        $this->loadModel('TsumegoRatingAttempt');
684        $this->loadModel('Schedule');
685        $this->loadModel('Tsumego');
686        $this->loadModel('SetConnection');
687
688        $ut = $this->TsumegoRatingAttempt->find('all', ['limit' => 10000, 'order' => 'created DESC', 'conditions' => ['status' => 'S']]);
689        if (!$ut) {
690            $ut = [];
691        }
692        $out = $this->TsumegoAttempt->find('all', ['limit' => 30000, 'order' => 'updated DESC', 'conditions' => ['gain >=' => 40]]);
693        if (!$out) {
694            $out = [];
695        }
696
697        $date = date('Y-m-d', strtotime('yesterday'));
698        $s = $this->Schedule->find('all', ['conditions' => ['date' => $date]]);
699        if (!$s) {
700            $s = [];
701        }
702        $ids = [];
703        $utCount = count($ut);
704        for ($i = 0; $i < $utCount; $i++) {
705            $date2 = new DateTime($ut[$i]['TsumegoRatingAttempt']['created']);
706            $date2 = $date2->format('Y-m-d');
707            if ($date === $date2) {
708                array_push($ids, $ut[$i]['TsumegoRatingAttempt']['tsumego_id']);
709            }
710        }
711        $ids = array_count_values($ids);
712        $highest = 0;
713        $best = [];
714        foreach ($ids as $key => $value) {
715            if ($value > $highest) {
716                $highest = $value;
717            }
718        }
719        foreach ($ids as $key => $value) {
720            if ($value == $highest) {
721                $x = [];
722                $x[$key] = $value;
723                array_push($best, $x);
724            }
725        }
726        $ids2 = [];
727        $out2 = [];
728        $outCount = count($out);
729        for ($i = 0; $i < $outCount; $i++) {
730            $date2 = new DateTime($out[$i]['TsumegoAttempt']['updated']);
731            $date2 = $date2->format('Y-m-d');
732            if ($date === $date2) {
733                array_push($ids2, $out[$i]['TsumegoAttempt']['tsumego_id']);
734                array_push($out2, $out[$i]);
735            }
736        }
737        $ids2 = array_count_values($ids2);
738        $highest = 0;
739        $best2 = [];
740        foreach ($ids2 as $key => $value) {
741            if ($value > $highest) {
742                $highest = $value;
743            }
744        }
745        $done = false;
746        $found = 0;
747        $decrement = 0;
748        $best3 = [];
749        $findNum = 20;
750        while (!$done) {
751            foreach ($ids2 as $key => $value) {
752                if ($value == $highest - $decrement) {
753                    array_push($best2, $key);
754                    array_push($best3, $value);
755                    $found++;
756                }
757            }
758            $decrement++;
759            if ($found < $findNum) {
760                $done = false;
761            } else {
762                $done = true;
763            }
764        }
765        $newBest = [];
766        for ($j = 0; $j < $findNum; $j++) {
767            $newBest[$j] = [];
768        }
769        $out2Count = count($out2);
770        for ($i = 0; $i < $out2Count; $i++) {
771            for ($j = 0; $j < $findNum; $j++) {
772                if ($out2[$i]['TsumegoAttempt']['tsumego_id'] == $best2[$j]) {
773                    $x = [];
774                    $x['tid'] = $out2[$i]['TsumegoAttempt']['tsumego_id'];
775                    $tx = $this->Tsumego->findById($x['tid']);
776                    $scT = $this->SetConnection->find('first', ['conditions' => ['tsumego_id' => $tx['Tsumego']['id']]]);
777                    $tx['Tsumego']['set_id'] = $scT['SetConnection']['set_id'];
778                    $x['sid'] = $tx['Tsumego']['set_id'];
779                    $x['status'] = $out2[$i]['TsumegoAttempt']['solved'];
780                    $x['seconds'] = $out2[$i]['TsumegoAttempt']['seconds'];
781
782                    $newBest[$j][] = $x;
783                }
784            }
785        }
786        $newBestCount = count($newBest);
787        for ($i = 0; $i < $newBestCount; $i++) {
788            $sum = 0;
789            $newBestICount = count($newBest[$i]);
790            for ($j = 0; $j < $newBestICount; $j++) {
791                if ($newBest[$i][$j]['seconds'] != null) {
792                    if ($newBest[$i][$j]['seconds'] > 300) {
793                        $newBest[$i][$j]['seconds'] = 300;
794                    }
795                    $sum += $newBest[$i][$j]['seconds'];
796                }
797            }
798            $sum = $sum * count($newBest[$i]);
799            $newBest[$i]['sum'] = $sum;
800        }
801        $highest = 0;
802        $hid = 0;
803        $newBestCount = count($newBest);
804        for ($i = 0; $i < $newBestCount; $i++) {
805            if ($newBest[$i]['sum'] > $highest && $newBest[$i][0]['sid'] != 104 && $newBest[$i][0]['sid'] != 105 && $newBest[$i][0]['sid'] != 117) {
806                $yesterday = false;
807                $sCount = count($s);
808                for ($j = 0; $j < $sCount; $j++) {
809                    if ($newBest[$i][0]['tid'] == $s[$j]['Schedule']['tsumego_id']) {
810                        $yesterday = true;
811                    }
812                }
813                if (!$yesterday) {
814                    $highest = $newBest[$i]['sum'];
815                    $hid = $i;
816                }
817            }
818        }
819
820        return $newBest[$hid][0]['tid'];
821    }
822
823    protected function ratingMatch($elo) {
824        if ($elo >= 3000) {
825            $td = 10;//10d
826        } elseif ($elo >= 2900) {
827            $td = 10;//9d
828        } elseif ($elo >= 2800) {
829            $td = 10;//8d
830        } elseif ($elo >= 2700) {
831            $td = 10;//7d x2700
832        } elseif ($elo >= 2600) {
833            $td = 9;//6d x2600
834        } elseif ($elo >= 2500) {
835            $td = 8;//5d x2500
836        } elseif ($elo >= 2400) {
837            $td = 7;//4d
838        } elseif ($elo >= 2300) {
839            $td = 7;//3d x2350
840        } elseif ($elo >= 2200) {
841            $td = 6;//2d
842        } elseif ($elo >= 2100) {
843            $td = 6;//1d x2150
844        } elseif ($elo >= 2000) {
845            $td = 5;//1k
846        } elseif ($elo >= 1900) {
847            $td = 5;//2k x1950
848        } elseif ($elo >= 1800) {
849            $td = 4;//3k
850        } elseif ($elo >= 1700) {
851            $td = 4;//4k x1750
852        } elseif ($elo >= 1600) {
853            $td = 3;//5k
854        } elseif ($elo >= 1500) {
855            $td = 3;//6k x1500
856        } elseif ($elo >= 1400) {
857            $td = 3;//7k
858        } elseif ($elo >= 1300) {
859            $td = 2;//8k
860        } elseif ($elo >= 1200) {
861            $td = 2;//9k x1200
862        } elseif ($elo >= 1100) {
863            $td = 2;//10k
864        } elseif ($elo >= 1000) {
865            $td = 1;//11k
866        } elseif ($elo >= 900) {
867            $td = 1;//12k x900
868        } elseif ($elo >= 800) {
869            $td = 1;//13k
870        } elseif ($elo >= 700) {
871            $td = 1;//14k
872        } elseif ($elo >= 600) {
873            $td = 1;//15k
874        } elseif ($elo >= 500) {
875            $td = 1;//16k
876        } elseif ($elo >= 400) {
877            $td = 1;//17k
878        } elseif ($elo >= 300) {
879            $td = 1;//18k
880        } elseif ($elo >= 200) {
881            $td = 1;//19k
882        } elseif ($elo >= 100) {
883            $td = 1;//20k
884        } else {
885            $td = 1;
886        }
887
888        return $td;
889    }
890
891    protected function rating2($d) {
892        if ($d == 10) {
893            $elo = 2700;
894        } elseif ($d == 9) {
895            $elo = 2600;
896        } elseif ($d == 8) {
897            $elo = 2500;
898        } elseif ($d == 7) {
899            $elo = 2350;
900        } elseif ($d == 6) {
901            $elo = 2150;
902        } elseif ($d == 5) {
903            $elo = 1950;
904        } elseif ($d == 4) {
905            $elo = 1750;
906        } elseif ($d == 3) {
907            $elo = 1500;
908        } elseif ($d == 2) {
909            $elo = 1200;
910        } elseif ($d == 1) {
911            $elo = 900;
912        } else {
913            $elo = 1500;
914        }
915
916        return $elo;
917    }
918
919    public static function encrypt($str = null) {
920        $secret_key = 'my_simple_secret_keyx';
921        $secret_iv = 'my_simple_secret_ivx';
922        $encrypt_method = 'AES-256-CBC';
923        $key = hash('sha256', $secret_key);
924        $iv = substr(hash('sha256', $secret_iv), 0, 16);
925
926        return base64_encode(openssl_encrypt($str, $encrypt_method, $key, 0, $iv));
927    }
928
929    public static function decrypt($str = null) {
930        $string = $str;
931        $secret_key = 'my_simple_secret_keyx';
932        $secret_iv = 'my_simple_secret_ivx';
933        $encrypt_method = 'AES-256-CBC';
934        $key = hash('sha256', $secret_key);
935        $iv = substr(hash('sha256', $secret_iv), 0, 16);
936
937        return openssl_decrypt(base64_decode($string), $encrypt_method, $key, 0, $iv);
938    }
939
940    protected function checkPictureLarge($u) {
941        if (substr($u['User']['name'], 0, 3) == 'g__' && $u['User']['external_id'] != null) {
942            return '<img class="google-profile-image-large" src="/img/google/' . $u['User']['picture'] . '">' . substr($u['User']['name'], 3);
943        }
944
945        return $u['User']['name'];
946    }
947    public static function checkPicture($user) {
948        if (substr($user['name'], 0, 3) == 'g__' && $user['external_id'] != null) {
949            return '<img class="google-profile-image" src="/img/google/' . $user['picture'] . '">' . substr($user['name'], 3);
950        }
951
952        return $user['name'];
953    }
954
955    public static function getTsumegoRankx($t) {
956        if ($t <= 0) {
957            return '15k';
958        }
959        if ($t > 0 && $t <= 22) {
960            $tRank = '5d';
961        } elseif ($t <= 26.5) {
962            $tRank = '4d';
963        } elseif ($t <= 30) {
964            $tRank = '3d';
965        } elseif ($t <= 34) {
966            $tRank = '2d';
967        } elseif ($t <= 38) {
968            $tRank = '1d';
969        } elseif ($t <= 42) {
970            $tRank = '1k';
971        } elseif ($t <= 46) {
972            $tRank = '2k';
973        } elseif ($t <= 50) {
974            $tRank = '3k';
975        } elseif ($t <= 54.5) {
976            $tRank = '4k';
977        } elseif ($t <= 58.5) {
978            $tRank = '5k';
979        } elseif ($t <= 63) {
980            $tRank = '6k';
981        } elseif ($t <= 67) {
982            $tRank = '7k';
983        } elseif ($t <= 70.8) {
984            $tRank = '8k';
985        } elseif ($t <= 74.8) {
986            $tRank = '9k';
987        } elseif ($t <= 79) {
988            $tRank = '10k';
989        } elseif ($t <= 83.5) {
990            $tRank = '11k';
991        } elseif ($t <= 88) {
992            $tRank = '12k';
993        } elseif ($t <= 92) {
994            $tRank = '13k';
995        } elseif ($t <= 96) {
996            $tRank = '14k';
997        } else {
998            $tRank = '15k';
999        }
1000
1001        return $tRank;
1002    }
1003    protected function adjustElo($v) {
1004        $add = 0;
1005        if ($v >= 1700) {
1006            $add = 110;
1007        } elseif ($v >= 1600) {
1008            $add = 110;
1009        } elseif ($v >= 1700) {
1010            $add = 100;
1011        } elseif ($v >= 1600) {
1012            $add = 90;
1013        } elseif ($v >= 1500) {
1014            $add = 80;
1015        } elseif ($v >= 1400) {
1016            $add = 70;
1017        } elseif ($v >= 1300) {
1018            $add = 60;
1019        } elseif ($v >= 1200) {
1020            $add = 60;
1021        } elseif ($v >= 1100) {
1022            $add = 50;
1023        } elseif ($v >= 1000) {
1024            $add = 50;
1025        } else {
1026            $add = 0;
1027        }
1028
1029        return $v + $add;
1030    }
1031
1032    protected function getTsumegoRankVal($t) {
1033        if ($t <= 0) {
1034            return 0;
1035        }
1036        if ($t > 0 && $t <= 22) {
1037            return 22 - $t;
1038        }
1039        if ($t <= 26.5) {
1040            return 26.5 - $t;
1041        }
1042        if ($t <= 30) {
1043            return 30 - $t;
1044        }
1045        if ($t <= 34) {
1046            return 34 - $t;
1047        }
1048        if ($t <= 38) {
1049            return 38 - $t;
1050        }
1051        if ($t <= 42) {
1052            return 42 - $t;
1053        }
1054        if ($t <= 46) {
1055            return 46 - $t;
1056        }
1057        if ($t <= 50) {
1058            return 50 - $t;
1059        }
1060        if ($t <= 54.5) {
1061            return 54.5 - $t;
1062        }
1063        if ($t <= 58.5) {
1064            return 58.5 - $t;
1065        }
1066        if ($t <= 63) {
1067            return 63 - $t;
1068        }
1069        if ($t <= 67) {
1070            return 67 - $t;
1071        }
1072        if ($t <= 70.8) {
1073            return 70.8 - $t;
1074        }
1075        if ($t <= 74.8) {
1076            return 74.8 - $t;
1077        }
1078        if ($t <= 79) {
1079            return 79 - $t;
1080        }
1081        if ($t <= 83.5) {
1082            return 83.5 - $t;
1083        }
1084        if ($t <= 88) {
1085            return 88 - $t;
1086        }
1087        if ($t <= 92) {
1088            return 92 - $t;
1089        }
1090        if ($t <= 96) {
1091            return 96 - $t;
1092        }
1093
1094        return 100 - $t;
1095    }
1096    protected function getTsumegoRankMax($t) {
1097        if ($t <= 0) {
1098            return 100 - 96;
1099        }
1100        if ($t > 0 && $t <= 22) {
1101            return 22;
1102        }
1103        if ($t <= 26.5) {
1104            return 26.5 - 22;
1105        }
1106        if ($t <= 30) {
1107            return 30 - 26.5;
1108        }
1109        if ($t <= 34) {
1110            return 34 - 30;
1111        }
1112        if ($t <= 38) {
1113            return 38 - 34;
1114        }
1115        if ($t <= 42) {
1116            return 42 - 38;
1117        }
1118        if ($t <= 46) {
1119            return 46 - 42;
1120        }
1121        if ($t <= 50) {
1122            return 50 - 46;
1123        }
1124        if ($t <= 54.5) {
1125            return 54.5 - 50;
1126        }
1127        if ($t <= 58.5) {
1128            return 58.5 - 54.5;
1129        }
1130        if ($t <= 63) {
1131            return 63 - 58.5;
1132        }
1133        if ($t <= 67) {
1134            return 67 - 63;
1135        }
1136        if ($t <= 70.8) {
1137            return 70.8 - 67;
1138        }
1139        if ($t <= 74.8) {
1140            return 74.8 - 70.8;
1141        }
1142        if ($t <= 79) {
1143            return 79 - 74.8;
1144        }
1145        if ($t <= 83.5) {
1146            return 83.5 - 79;
1147        }
1148        if ($t <= 88) {
1149            return 88 - 83.5;
1150        }
1151        if ($t <= 92) {
1152            return 92 - 88;
1153        }
1154        if ($t <= 96) {
1155            return 96 - 92;
1156        }
1157
1158        return 100 - 96;
1159    }
1160
1161    public static function saveDanSolveCondition($solvedTsumegoRank, $tId): void {
1162        if ($solvedTsumegoRank == '1d' || $solvedTsumegoRank == '2d' || $solvedTsumegoRank == '3d' || $solvedTsumegoRank == '4d' || $solvedTsumegoRank == '5d') {
1163            $danSolveCategory = 'danSolve' . $solvedTsumegoRank;
1164            $danSolveCondition = ClassRegistry::init('AchievementCondition')->find('first', [
1165                'order' => 'value DESC',
1166                'conditions' => [
1167                    'user_id' => Auth::getUserID(),
1168                    'category' => $danSolveCategory,
1169                ],
1170            ]);
1171            if (!$danSolveCondition) {
1172                $danSolveCondition = [];
1173                $danSolveCondition['AchievementCondition']['value'] = 0;
1174                ClassRegistry::init('AchievementCondition')->create();
1175            }
1176            $danSolveCondition['AchievementCondition']['category'] = $danSolveCategory;
1177            $danSolveCondition['AchievementCondition']['user_id'] = Auth::getUserID();
1178            $danSolveCondition['AchievementCondition']['set_id'] = $tId;
1179            $danSolveCondition['AchievementCondition']['value']++;
1180
1181            ClassRegistry::init('AchievementCondition')->save($danSolveCondition);
1182        }
1183    }
1184
1185    public static function updateSprintCondition(bool $trigger = false): void {
1186        if (Auth::isLoggedIn()) {
1187            $sprintCondition = ClassRegistry::init('AchievementCondition')->find('first', [
1188                'order' => 'value DESC',
1189                'conditions' => [
1190                    'user_id' => Auth::getUserID(),
1191                    'category' => 'sprint',
1192                ],
1193            ]);
1194            if (!$sprintCondition) {
1195                $sprintCondition = [];
1196                $sprintCondition['AchievementCondition']['value'] = 0;
1197                ClassRegistry::init('AchievementCondition')->create();
1198            }
1199            $sprintCondition['AchievementCondition']['category'] = 'sprint';
1200            $sprintCondition['AchievementCondition']['user_id'] = Auth::getUserID();
1201            if ($trigger) {
1202                $sprintCondition['AchievementCondition']['value']++;
1203            } else {
1204                $sprintCondition['AchievementCondition']['value'] = 0;
1205            }
1206            ClassRegistry::init('AchievementCondition')->save($sprintCondition);
1207        }
1208    }
1209
1210    public static function updateGoldenCondition(bool $trigger = false): void {
1211        $goldenCondition = ClassRegistry::init('AchievementCondition')->find('first', [
1212            'order' => 'value DESC',
1213            'conditions' => [
1214                'user_id' => Auth::getUserID(),
1215                'category' => 'golden',
1216            ],
1217        ]);
1218        if (!$goldenCondition) {
1219            $goldenCondition = [];
1220            $goldenCondition['AchievementCondition']['value'] = 0;
1221            ClassRegistry::init('AchievementCondition')->create();
1222        }
1223        $goldenCondition['AchievementCondition']['category'] = 'golden';
1224        $goldenCondition['AchievementCondition']['user_id'] = Auth::getUserID();
1225        if ($trigger) {
1226            $goldenCondition['AchievementCondition']['value']++;
1227        } else {
1228            $goldenCondition['AchievementCondition']['value'] = 0;
1229        }
1230        ClassRegistry::init('AchievementCondition')->save($goldenCondition);
1231    }
1232
1233    public static function setPotionCondition(): void {
1234        $potionCondition = ClassRegistry::init('AchievementCondition')->find('first', [
1235            'order' => 'value DESC',
1236            'conditions' => [
1237                'user_id' => Auth::getUserID(),
1238                'category' => 'potion',
1239            ],
1240        ]);
1241        if (!$potionCondition) {
1242            $potionCondition = [];
1243            ClassRegistry::init('AchievementCondition')->create();
1244        }
1245        $potionCondition['AchievementCondition']['category'] = 'potion';
1246        $potionCondition['AchievementCondition']['user_id'] = Auth::getUserID();
1247        $potionCondition['AchievementCondition']['value'] = 1;
1248        ClassRegistry::init('AchievementCondition')->save($potionCondition);
1249    }
1250
1251    public static function updateGems(string $rank): void {
1252        $datex = new DateTime('today');
1253        $dateGem = ClassRegistry::init('DayRecord')->find('first', ['conditions' => ['date' => $datex->format('Y-m-d')]]);
1254        if ($dateGem != null) {
1255            $gems = explode('-', $dateGem['DayRecord']['gems']);
1256            $gemValue = '';
1257            $gemValue2 = '';
1258            $gemValue3 = '';
1259            $condition1 = 500;
1260            $condition2 = 200;
1261            $condition3 = 5;
1262            $found1 = false;
1263            $found2 = false;
1264            $found3 = false;
1265            if ($rank == '15k' || $rank == '14k' || $rank == '13k' || $rank == '12k' || $rank == '11k' || $rank == '10k') {
1266                if ($gems[0] == 0) {
1267                    $gemValue = '15k';
1268                } elseif ($gems[0] == 1) {
1269                    $gemValue = '12k';
1270                } elseif ($gems[0] == 2) {
1271                    $gemValue = '10k';
1272                }
1273                if ($rank == $gemValue) {
1274                    $dateGem['DayRecord']['gemCounter1']++;
1275                    if ($dateGem['DayRecord']['gemCounter1'] == $condition1) {
1276                        $found1 = true;
1277                    }
1278                }
1279            } elseif ($rank == '9k' || $rank == '8k' || $rank == '7k' || $rank == '6k' || $rank == '5k' || $rank == '4k' || $rank == '3k' || $rank == '2k' || $rank == '1k') {
1280                if ($gems[1] == 0) {
1281                    $gemValue = '9k';
1282                    $gemValue2 = 'x';
1283                    $gemValue3 = 'y';
1284                } elseif ($gems[1] == 1) {
1285                    $gemValue = '6k';
1286                    $gemValue2 = '5k';
1287                    $gemValue3 = '4k';
1288                } elseif ($gems[1] == 2) {
1289                    $gemValue = 'x';
1290                    $gemValue2 = '2k';
1291                    $gemValue3 = '1k';
1292                }
1293                if ($rank == $gemValue || $rank == $gemValue2 || $rank == $gemValue3) {
1294                    $dateGem['DayRecord']['gemCounter2']++;
1295                    if ($dateGem['DayRecord']['gemCounter2'] == $condition2) {
1296                        $found2 = true;
1297                    }
1298                }
1299            } elseif ($rank == '1d' || $rank == '2d' || $rank == '3d' || $rank == '4d' || $rank == '5d' || $rank == '6d' || $rank == '7d') {
1300                if ($gems[2] == 0) {
1301                    $gemValue = '1d';
1302                    $gemValue2 = '2d';
1303                    $gemValue3 = '3d';
1304                } elseif ($gems[2] == 1) {
1305                    $gemValue = '2d';
1306                    $gemValue2 = '3d';
1307                    $gemValue3 = '4d';
1308                } elseif ($gems[2] == 2) {
1309                    $gemValue = '5d';
1310                    $gemValue2 = '6d';
1311                    $gemValue3 = '7d';
1312                }
1313                if ($rank == $gemValue || $rank == $gemValue2 || $rank == $gemValue3) {
1314                    $dateGem['DayRecord']['gemCounter3']++;
1315                    if ($dateGem['DayRecord']['gemCounter3'] == $condition3) {
1316                        $found3 = true;
1317                    }
1318                }
1319            }
1320            if ($found1) {
1321                $aCondition = ClassRegistry::init('AchievementCondition')->find('first', [
1322                    'order' => 'value DESC',
1323                    'conditions' => [
1324                        'user_id' => Auth::getUserID(),
1325                        'category' => 'emerald',
1326                    ],
1327                ]);
1328                if ($aCondition == null) {
1329                    $aCondition = [];
1330                    $aCondition['AchievementCondition']['category'] = 'emerald';
1331                    $aCondition['AchievementCondition']['user_id'] = Auth::getUserID();
1332                    $aCondition['AchievementCondition']['value'] = 1;
1333                    ClassRegistry::init('AchievementCondition')->save($aCondition);
1334                } else {
1335                    $dateGem['DayRecord']['gemCounter1']--;
1336                }
1337            } elseif ($found2) {
1338                $aCondition = ClassRegistry::init('AchievementCondition')->find('first', [
1339                    'order' => 'value DESC',
1340                    'conditions' => [
1341                        'user_id' => Auth::getUserID(),
1342                        'category' => 'sapphire',
1343                    ],
1344                ]);
1345                if ($aCondition == null) {
1346                    $aCondition = [];
1347                    $aCondition['AchievementCondition']['category'] = 'sapphire';
1348                    $aCondition['AchievementCondition']['user_id'] = Auth::getUserID();
1349                    $aCondition['AchievementCondition']['value'] = 1;
1350                    ClassRegistry::init('AchievementCondition')->save($aCondition);
1351                } else {
1352                    $dateGem['DayRecord']['gemCounter2']--;
1353                }
1354            } elseif ($found3) {
1355                $aCondition = ClassRegistry::init('AchievementCondition')->find('first', [
1356                    'order' => 'value DESC',
1357                    'conditions' => [
1358                        'user_id' => Auth::getUserID(),
1359                        'category' => 'ruby',
1360                    ],
1361                ]);
1362                if ($aCondition == null) {
1363                    $aCondition = [];
1364                    $aCondition['AchievementCondition']['category'] = 'ruby';
1365                    $aCondition['AchievementCondition']['user_id'] = Auth::getUserID();
1366                    $aCondition['AchievementCondition']['value'] = 1;
1367                    ClassRegistry::init('AchievementCondition')->save($aCondition);
1368                } else {
1369                    $dateGem['DayRecord']['gemCounter3']--;
1370                }
1371            }
1372        }
1373        ClassRegistry::init('DayRecord')->save($dateGem);
1374    }
1375
1376    public static function checkProblemNumberAchievements() {
1377        if (!Auth::isLoggedIn()) {
1378            return;
1379        }
1380
1381        $buffer = ClassRegistry::init('AchievementStatus')->find('all', ['conditions' => ['user_id' => Auth::getUserID()]]);
1382        if (!$buffer) {
1383            $buffer = [];
1384        }
1385        $existingAs = [];
1386        $bufferCount = count($buffer);
1387        for ($i = 0; $i < $bufferCount; $i++) {
1388            $existingAs[$buffer[$i]['AchievementStatus']['achievement_id']] = $buffer[$i];
1389        }
1390        $as = [];
1391        $as['AchievementStatus']['user_id'] = Auth::getUserID();
1392        $updated = [];
1393
1394        $achievementId = 1;
1395        $solvedCount = Auth::getUser()['solved'];
1396        if ($solvedCount >= 1000 && !isset($existingAs[$achievementId])) {
1397            $as['AchievementStatus']['achievement_id'] = $achievementId;
1398            ClassRegistry::init('AchievementStatus')->create();
1399            ClassRegistry::init('AchievementStatus')->save($as);
1400            array_push($updated, $achievementId);
1401        }
1402        $achievementId = 2;
1403        if ($solvedCount >= 2000 && !isset($existingAs[$achievementId])) {
1404            $as['AchievementStatus']['achievement_id'] = $achievementId;
1405            ClassRegistry::init('AchievementStatus')->create();
1406            ClassRegistry::init('AchievementStatus')->save($as);
1407            array_push($updated, $achievementId);
1408        }
1409        $achievementId = 3;
1410        if ($solvedCount >= 3000 && !isset($existingAs[$achievementId])) {
1411            $as['AchievementStatus']['achievement_id'] = $achievementId;
1412            ClassRegistry::init('AchievementStatus')->create();
1413            ClassRegistry::init('AchievementStatus')->save($as);
1414            array_push($updated, $achievementId);
1415        }
1416        $achievementId = 4;
1417        if ($solvedCount >= 4000 && !isset($existingAs[$achievementId])) {
1418            $as['AchievementStatus']['achievement_id'] = $achievementId;
1419            ClassRegistry::init('AchievementStatus')->create();
1420            ClassRegistry::init('AchievementStatus')->save($as);
1421            array_push($updated, $achievementId);
1422        }
1423        $achievementId = 5;
1424        if ($solvedCount >= 5000 && !isset($existingAs[$achievementId])) {
1425            $as['AchievementStatus']['achievement_id'] = $achievementId;
1426            ClassRegistry::init('AchievementStatus')->create();
1427            ClassRegistry::init('AchievementStatus')->save($as);
1428            array_push($updated, $achievementId);
1429        }
1430        $achievementId = 6;
1431        if ($solvedCount >= 6000 && !isset($existingAs[$achievementId])) {
1432            $as['AchievementStatus']['achievement_id'] = $achievementId;
1433            ClassRegistry::init('AchievementStatus')->create();
1434            ClassRegistry::init('AchievementStatus')->save($as);
1435            array_push($updated, $achievementId);
1436        }
1437        $achievementId = 7;
1438        if ($solvedCount >= 7000 && !isset($existingAs[$achievementId])) {
1439            $as['AchievementStatus']['achievement_id'] = $achievementId;
1440            ClassRegistry::init('AchievementStatus')->create();
1441            ClassRegistry::init('AchievementStatus')->save($as);
1442            array_push($updated, $achievementId);
1443        }
1444        $achievementId = 8;
1445        if ($solvedCount >= 8000 && !isset($existingAs[$achievementId])) {
1446            $as['AchievementStatus']['achievement_id'] = $achievementId;
1447            ClassRegistry::init('AchievementStatus')->create();
1448            ClassRegistry::init('AchievementStatus')->save($as);
1449            array_push($updated, $achievementId);
1450        }
1451        $achievementId = 9;
1452        if ($solvedCount >= 9000 && !isset($existingAs[$achievementId])) {
1453            $as['AchievementStatus']['achievement_id'] = $achievementId;
1454            ClassRegistry::init('AchievementStatus')->create();
1455            ClassRegistry::init('AchievementStatus')->save($as);
1456            array_push($updated, $achievementId);
1457        }
1458        $achievementId = 10;
1459        if ($solvedCount >= 10000 && !isset($existingAs[$achievementId])) {
1460            $as['AchievementStatus']['achievement_id'] = $achievementId;
1461            ClassRegistry::init('AchievementStatus')->create();
1462            ClassRegistry::init('AchievementStatus')->save($as);
1463            array_push($updated, $achievementId);
1464        }
1465        //uotd achievement
1466        $achievementId = 11;
1467        if (!isset($existingAs[$achievementId])) {
1468            $condition = ClassRegistry::init('AchievementCondition')->find('first', ['conditions' => ['user_id' => Auth::getUserID(), 'category' => 'uotd']]);
1469            if ($condition != null) {
1470                $as['AchievementStatus']['achievement_id'] = $achievementId;
1471                ClassRegistry::init('AchievementStatus')->create();
1472                ClassRegistry::init('AchievementStatus')->save($as);
1473                array_push($updated, $achievementId);
1474            }
1475        }
1476
1477        $updatedCount = count($updated);
1478        for ($i = 0; $i < $updatedCount; $i++) {
1479            $a = ClassRegistry::init('Achievement')->findById($updated[$i]);
1480            $updated[$i] = [];
1481            $updated[$i][0] = $a['Achievement']['name'];
1482            $updated[$i][1] = $a['Achievement']['description'];
1483            $updated[$i][2] = $a['Achievement']['image'];
1484            $updated[$i][3] = $a['Achievement']['color'];
1485            $updated[$i][4] = $a['Achievement']['xp'];
1486            $updated[$i][5] = $a['Achievement']['id'];
1487        }
1488
1489        return $updated;
1490    }
1491
1492    public static function checkDanSolveAchievements() {
1493        if (Auth::isLoggedIn()) {
1494            $buffer = ClassRegistry::init('AchievementStatus')->find('all', ['conditions' => ['user_id' => Auth::getUserID()]]);
1495            if (!$buffer) {
1496                $buffer = [];
1497            }
1498            $ac = ClassRegistry::init('AchievementCondition')->find('all', [
1499                'order' => 'category ASC',
1500                'conditions' => [
1501                    'user_id' => Auth::getUserID(),
1502                    'OR' => [
1503                        ['category' => 'danSolve1d'],
1504                        ['category' => 'danSolve2d'],
1505                        ['category' => 'danSolve3d'],
1506                        ['category' => 'danSolve4d'],
1507                        ['category' => 'danSolve5d'],
1508                        ['category' => 'emerald'],
1509                        ['category' => 'sapphire'],
1510                        ['category' => 'ruby'],
1511                        ['category' => 'sprint'],
1512                        ['category' => 'golden'],
1513                        ['category' => 'potion'],
1514                    ],
1515                ],
1516            ]);
1517            if (!$ac) {
1518                $ac = [];
1519            }
1520            $ac1 = [];
1521            $acCount = count($ac);
1522            for ($i = 0; $i < $acCount; $i++) {
1523                if ($ac[$i]['AchievementCondition']['category'] == 'danSolve1d') {
1524                    $ac1['1d'] = $ac[$i]['AchievementCondition']['value'];
1525                } elseif ($ac[$i]['AchievementCondition']['category'] == 'danSolve2d') {
1526                    $ac1['2d'] = $ac[$i]['AchievementCondition']['value'];
1527                } elseif ($ac[$i]['AchievementCondition']['category'] == 'danSolve3d') {
1528                    $ac1['3d'] = $ac[$i]['AchievementCondition']['value'];
1529                } elseif ($ac[$i]['AchievementCondition']['category'] == 'danSolve4d') {
1530                    $ac1['4d'] = $ac[$i]['AchievementCondition']['value'];
1531                } elseif ($ac[$i]['AchievementCondition']['category'] == 'danSolve5d') {
1532                    $ac1['5d'] = $ac[$i]['AchievementCondition']['value'];
1533                } elseif ($ac[$i]['AchievementCondition']['category'] == 'emerald') {
1534                    $ac1['emerald'] = $ac[$i]['AchievementCondition']['value'];
1535                } elseif ($ac[$i]['AchievementCondition']['category'] == 'sapphire') {
1536                    $ac1['sapphire'] = $ac[$i]['AchievementCondition']['value'];
1537                } elseif ($ac[$i]['AchievementCondition']['category'] == 'ruby') {
1538                    $ac1['ruby'] = $ac[$i]['AchievementCondition']['value'];
1539                } elseif ($ac[$i]['AchievementCondition']['category'] == 'sprint') {
1540                    $ac1['sprint'] = $ac[$i]['AchievementCondition']['value'];
1541                } elseif ($ac[$i]['AchievementCondition']['category'] == 'golden') {
1542                    $ac1['golden'] = $ac[$i]['AchievementCondition']['value'];
1543                } elseif ($ac[$i]['AchievementCondition']['category'] == 'potion') {
1544                    $ac1['potion'] = $ac[$i]['AchievementCondition']['value'];
1545                }
1546            }
1547
1548            $existingAs = [];
1549            $bufferCount = count($buffer);
1550            for ($i = 0; $i < $bufferCount; $i++) {
1551                $existingAs[$buffer[$i]['AchievementStatus']['achievement_id']] = $buffer[$i];
1552            }
1553            $as = [];
1554            $as['AchievementStatus']['user_id'] = Auth::getUserID();
1555            $updated = [];
1556            $achievementId = 101;
1557            if ($ac1['1d'] > 0 && !isset($existingAs[$achievementId])) {
1558                $as['AchievementStatus']['achievement_id'] = $achievementId;
1559                ClassRegistry::init('AchievementStatus')->create();
1560                ClassRegistry::init('AchievementStatus')->save($as);
1561                array_push($updated, $achievementId);
1562            }
1563            $achievementId = 102;
1564            if ($ac1['2d'] > 0 && !isset($existingAs[$achievementId])) {
1565                $as['AchievementStatus']['achievement_id'] = $achievementId;
1566                ClassRegistry::init('AchievementStatus')->create();
1567                ClassRegistry::init('AchievementStatus')->save($as);
1568                array_push($updated, $achievementId);
1569            }
1570            $achievementId = 103;
1571            if ($ac1['3d'] > 0 && !isset($existingAs[$achievementId])) {
1572                $as['AchievementStatus']['achievement_id'] = $achievementId;
1573                ClassRegistry::init('AchievementStatus')->create();
1574                ClassRegistry::init('AchievementStatus')->save($as);
1575                array_push($updated, $achievementId);
1576            }
1577            $achievementId = 104;
1578            if ($ac1['4d'] > 0 && !isset($existingAs[$achievementId])) {
1579                $as['AchievementStatus']['achievement_id'] = $achievementId;
1580                ClassRegistry::init('AchievementStatus')->create();
1581                ClassRegistry::init('AchievementStatus')->save($as);
1582                array_push($updated, $achievementId);
1583            }
1584            $achievementId = 105;
1585            if ($ac1['5d'] > 0 && !isset($existingAs[$achievementId])) {
1586                $as['AchievementStatus']['achievement_id'] = $achievementId;
1587                ClassRegistry::init('AchievementStatus')->create();
1588                ClassRegistry::init('AchievementStatus')->save($as);
1589                array_push($updated, $achievementId);
1590            }
1591            $achievementId = 106;
1592            if ($ac1['1d'] >= 10 && !isset($existingAs[$achievementId])) {
1593                $as['AchievementStatus']['achievement_id'] = $achievementId;
1594                ClassRegistry::init('AchievementStatus')->create();
1595                ClassRegistry::init('AchievementStatus')->save($as);
1596                array_push($updated, $achievementId);
1597            }
1598            $achievementId = 107;
1599            if ($ac1['2d'] >= 10 && !isset($existingAs[$achievementId])) {
1600                $as['AchievementStatus']['achievement_id'] = $achievementId;
1601                ClassRegistry::init('AchievementStatus')->create();
1602                ClassRegistry::init('AchievementStatus')->save($as);
1603                array_push($updated, $achievementId);
1604            }
1605            $achievementId = 108;
1606            if ($ac1['3d'] >= 10 && !isset($existingAs[$achievementId])) {
1607                $as['AchievementStatus']['achievement_id'] = $achievementId;
1608                ClassRegistry::init('AchievementStatus')->create();
1609                ClassRegistry::init('AchievementStatus')->save($as);
1610                array_push($updated, $achievementId);
1611            }
1612            $achievementId = 109;
1613            if ($ac1['4d'] >= 10 && !isset($existingAs[$achievementId])) {
1614                $as['AchievementStatus']['achievement_id'] = $achievementId;
1615                ClassRegistry::init('AchievementStatus')->create();
1616                ClassRegistry::init('AchievementStatus')->save($as);
1617                array_push($updated, $achievementId);
1618            }
1619            $achievementId = 110;
1620            if ($ac1['5d'] >= 10 && !isset($existingAs[$achievementId])) {
1621                $as['AchievementStatus']['achievement_id'] = $achievementId;
1622                ClassRegistry::init('AchievementStatus')->create();
1623                ClassRegistry::init('AchievementStatus')->save($as);
1624                array_push($updated, $achievementId);
1625            }
1626            $achievementId = 111;
1627            if (isset($ac1['emerald'])) {
1628                if ($ac1['emerald'] == 1 && !isset($existingAs[$achievementId])) {
1629                    $as['AchievementStatus']['achievement_id'] = $achievementId;
1630                    ClassRegistry::init('AchievementStatus')->create();
1631                    ClassRegistry::init('AchievementStatus')->save($as);
1632                    array_push($updated, $achievementId);
1633                }
1634            }
1635            $achievementId = 112;
1636            if (isset($ac1['sapphire'])) {
1637                if ($ac1['sapphire'] == 1 && !isset($existingAs[$achievementId])) {
1638                    $as['AchievementStatus']['achievement_id'] = $achievementId;
1639                    ClassRegistry::init('AchievementStatus')->create();
1640                    ClassRegistry::init('AchievementStatus')->save($as);
1641                    array_push($updated, $achievementId);
1642                }
1643            }
1644            $achievementId = 113;
1645            if (isset($ac1['ruby'])) {
1646                if ($ac1['ruby'] == 1 && !isset($existingAs[$achievementId])) {
1647                    $as['AchievementStatus']['achievement_id'] = $achievementId;
1648                    ClassRegistry::init('AchievementStatus')->create();
1649                    ClassRegistry::init('AchievementStatus')->save($as);
1650                    array_push($updated, $achievementId);
1651                }
1652            }
1653            $achievementId = 114;
1654            if (!isset($existingAs[$achievementId]) && isset($existingAs[111]) && isset($existingAs[112]) && isset($existingAs[113])) {
1655                $as['AchievementStatus']['achievement_id'] = $achievementId;
1656                ClassRegistry::init('AchievementStatus')->create();
1657                ClassRegistry::init('AchievementStatus')->save($as);
1658                array_push($updated, $achievementId);
1659            }
1660            $achievementId = 96;
1661            if (!isset($existingAs[$achievementId]) && $ac1['sprint'] >= 30) {
1662                $as['AchievementStatus']['achievement_id'] = $achievementId;
1663                ClassRegistry::init('AchievementStatus')->create();
1664                ClassRegistry::init('AchievementStatus')->save($as);
1665                array_push($updated, $achievementId);
1666            }
1667            $achievementId = 97;
1668            if (!isset($existingAs[$achievementId]) && $ac1['golden'] >= 10) {
1669                $as['AchievementStatus']['achievement_id'] = $achievementId;
1670                ClassRegistry::init('AchievementStatus')->create();
1671                ClassRegistry::init('AchievementStatus')->save($as);
1672                array_push($updated, $achievementId);
1673            }
1674            $achievementId = 98;
1675            if (!isset($existingAs[$achievementId]) && $ac1['potion'] >= 1) {
1676                $as['AchievementStatus']['achievement_id'] = $achievementId;
1677                ClassRegistry::init('AchievementStatus')->create();
1678                ClassRegistry::init('AchievementStatus')->save($as);
1679                array_push($updated, $achievementId);
1680            }
1681            $updatedCount = count($updated);
1682            for ($i = 0; $i < $updatedCount; $i++) {
1683                $a = ClassRegistry::init('Achievement')->findById($updated[$i]);
1684                $updated[$i] = [];
1685                $updated[$i][0] = $a['Achievement']['name'];
1686                $updated[$i][1] = $a['Achievement']['description'];
1687                $updated[$i][2] = $a['Achievement']['image'];
1688                $updated[$i][3] = $a['Achievement']['color'];
1689                $updated[$i][4] = $a['Achievement']['xp'];
1690                $updated[$i][5] = $a['Achievement']['id'];
1691            }
1692
1693            return $updated;
1694        }
1695    }
1696
1697    protected function checkForLocked($t, $setsWithPremium) {
1698        $scCheck = $this->SetConnection->find('first', ['conditions' => ['tsumego_id' => $t['Tsumego']['id']]]);
1699        if ($scCheck && in_array($scCheck['SetConnection']['set_id'], $setsWithPremium) && !Auth::hasPremium()) {
1700            $t['Tsumego']['locked'] = true;
1701        } else {
1702            $t['Tsumego']['locked'] = false;
1703        }
1704
1705        return $t;
1706    }
1707    public static function checkNoErrorAchievements() {
1708        if (Auth::isLoggedIn()) {
1709
1710            $ac = ClassRegistry::init('AchievementCondition')->find('first', [
1711                'order' => 'value DESC',
1712                'conditions' => [
1713                    'user_id' => Auth::getUserID(),
1714                    'category' => 'err',
1715                ],
1716            ]);
1717
1718            $buffer = ClassRegistry::init('AchievementStatus')->find('all', ['conditions' => ['user_id' => Auth::getUserID()]]);
1719            if (!$buffer) {
1720                $buffer = [];
1721            }
1722            $existingAs = [];
1723            $bufferCount = count($buffer);
1724            for ($i = 0; $i < $bufferCount; $i++) {
1725                $existingAs[$buffer[$i]['AchievementStatus']['achievement_id']] = $buffer[$i];
1726            }
1727            $as = [];
1728            $as['AchievementStatus']['user_id'] = Auth::getUserID();
1729            $updated = [];
1730
1731            $achievementId = 53;
1732            if ($ac['AchievementCondition']['value'] >= 10 && !isset($existingAs[$achievementId])) {
1733                $as['AchievementStatus']['achievement_id'] = $achievementId;
1734                ClassRegistry::init('AchievementStatus')->create();
1735                ClassRegistry::init('AchievementStatus')->save($as);
1736                array_push($updated, $achievementId);
1737            }
1738            $achievementId = 54;
1739            if ($ac['AchievementCondition']['value'] >= 20 && !isset($existingAs[$achievementId])) {
1740                $as['AchievementStatus']['achievement_id'] = $achievementId;
1741                ClassRegistry::init('AchievementStatus')->create();
1742                ClassRegistry::init('AchievementStatus')->save($as);
1743                array_push($updated, $achievementId);
1744            }
1745            $achievementId = 55;
1746            if ($ac['AchievementCondition']['value'] >= 30 && !isset($existingAs[$achievementId])) {
1747                $as['AchievementStatus']['achievement_id'] = $achievementId;
1748                ClassRegistry::init('AchievementStatus')->create();
1749                ClassRegistry::init('AchievementStatus')->save($as);
1750                array_push($updated, $achievementId);
1751            }
1752            $achievementId = 56;
1753            if ($ac['AchievementCondition']['value'] >= 50 && !isset($existingAs[$achievementId])) {
1754                $as['AchievementStatus']['achievement_id'] = $achievementId;
1755                ClassRegistry::init('AchievementStatus')->create();
1756                ClassRegistry::init('AchievementStatus')->save($as);
1757                array_push($updated, $achievementId);
1758            }
1759            $achievementId = 57;
1760            if ($ac['AchievementCondition']['value'] >= 100 && !isset($existingAs[$achievementId])) {
1761                $as['AchievementStatus']['achievement_id'] = $achievementId;
1762                ClassRegistry::init('AchievementStatus')->create();
1763                ClassRegistry::init('AchievementStatus')->save($as);
1764                array_push($updated, $achievementId);
1765            }
1766            $achievementId = 58;
1767            if ($ac['AchievementCondition']['value'] >= 200 && !isset($existingAs[$achievementId])) {
1768                $as['AchievementStatus']['achievement_id'] = $achievementId;
1769                ClassRegistry::init('AchievementStatus')->create();
1770                ClassRegistry::init('AchievementStatus')->save($as);
1771                array_push($updated, $achievementId);
1772            }
1773            $updatedCount = count($updated);
1774            for ($i = 0; $i < $updatedCount; $i++) {
1775                $a = ClassRegistry::init('Achievement')->findById($updated[$i]);
1776                $updated[$i] = [];
1777                $updated[$i][0] = $a['Achievement']['name'];
1778                $updated[$i][1] = $a['Achievement']['description'];
1779                $updated[$i][2] = $a['Achievement']['image'];
1780                $updated[$i][3] = $a['Achievement']['color'];
1781                $updated[$i][4] = $a['Achievement']['xp'];
1782                $updated[$i][5] = $a['Achievement']['id'];
1783            }
1784
1785            return $updated;
1786        }
1787    }
1788
1789    protected function checkTimeModeAchievements() {
1790        $this->loadModel('Achievement');
1791        $this->loadModel('AchievementStatus');
1792        $this->loadModel('TimeModeSession');
1793
1794        $buffer = ClassRegistry::init('AchievementStatus')->find('all', ['conditions' => ['user_id' => Auth::getUserID()]]);
1795        if (!$buffer) {
1796            $buffer = [];
1797        }
1798        $existingAs = [];
1799        $bufferCount = count($buffer);
1800        for ($i = 0; $i < $bufferCount; $i++) {
1801            $existingAs[$buffer[$i]['AchievementStatus']['achievement_id']] = $buffer[$i];
1802        }
1803        $as = [];
1804        $as['AchievementStatus']['user_id'] = Auth::getUserID();
1805        $updated = [];
1806
1807        $rBlitz = $this->TimeModeSession->find('all', ['conditions' => ['time_mode_category_id' => TimeModeUtil::$CATEGORY_BLITZ, 'user_id' => Auth::getUserID()]]);
1808        if (!$rBlitz) {
1809            $rBlitz = [];
1810        }
1811        $rFast = $this->TimeModeSession->find('all', ['conditions' => ['time_mode_category_id' => TimeModeUtil::$CATEGORY_FAST_SPEED, 'user_id' => Auth::getUserID()]]);
1812        if (!$rFast) {
1813            $rFast = [];
1814        }
1815        $rSlow = $this->TimeModeSession->find('all', ['conditions' => ['time_mode_category_id' => TimeModeUtil::$CATEGORY_SLOW_SPEED, 'user_id' => Auth::getUserID()]]);
1816        if (!$rSlow) {
1817            $rSlow = [];
1818        }
1819        $r = $this->TimeModeSession->find('all', ['conditions' => ['user_id' => Auth::getUserID()]]);
1820        if (!$r) {
1821            $r = [];
1822        }
1823
1824        $timeModeAchievements = [];
1825        for ($i = 70; $i <= 91; $i++) {
1826            $timeModeAchievements[$i] = false;
1827        }
1828        $rCount = count($r);
1829        for ($i = 0; $i < $rCount; $i++) {
1830            if ($r[$i]['TimeModeSession']['status'] == 's') {
1831                if ($r[$i]['TimeModeSession']['TimeModeAttempt'] == '5k') {
1832                    if ($r[$i]['TimeModeSession']['mode'] == 2) {
1833                        $timeModeAchievements[70] = true;
1834                    } elseif ($r[$i]['TimeModeSession']['mode'] == 1) {
1835                        $timeModeAchievements[76] = true;
1836                    } elseif ($r[$i]['TimeModeSession']['mode'] == 0) {
1837                        $timeModeAchievements[82] = true;
1838                    }
1839                } elseif ($r[$i]['TimeModeSession']['TimeModeAttempt'] == '4k') {
1840                    if ($r[$i]['TimeModeSession']['mode'] == 2) {
1841                        $timeModeAchievements[71] = true;
1842                    } elseif ($r[$i]['TimeModeSession']['mode'] == 1) {
1843                        $timeModeAchievements[77] = true;
1844                    } elseif ($r[$i]['TimeModeSession']['mode'] == 0) {
1845                        $timeModeAchievements[83] = true;
1846                    }
1847                } elseif ($r[$i]['TimeModeSession']['TimeModeAttempt'] == '3k') {
1848                    if ($r[$i]['TimeModeSession']['mode'] == 2) {
1849                        $timeModeAchievements[72] = true;
1850                    } elseif ($r[$i]['TimeModeSession']['mode'] == 1) {
1851                        $timeModeAchievements[78] = true;
1852                    } elseif ($r[$i]['TimeModeSession']['mode'] == 0) {
1853                        $timeModeAchievements[84] = true;
1854                    }
1855                } elseif ($r[$i]['TimeModeSession']['TimeModeAttempt'] == '2k') {
1856                    if ($r[$i]['TimeModeSession']['mode'] == 2) {
1857                        $timeModeAchievements[73] = true;
1858                    } elseif ($r[$i]['TimeModeSession']['mode'] == 1) {
1859                        $timeModeAchievements[79] = true;
1860                    } elseif ($r[$i]['TimeModeSession']['mode'] == 0) {
1861                        $timeModeAchievements[85] = true;
1862                    }
1863                } elseif ($r[$i]['TimeModeSession']['TimeModeAttempt'] == '1k') {
1864                    if ($r[$i]['TimeModeSession']['mode'] == 2) {
1865                        $timeModeAchievements[74] = true;
1866                    } elseif ($r[$i]['TimeModeSession']['mode'] == 1) {
1867                        $timeModeAchievements[80] = true;
1868                    } elseif ($r[$i]['TimeModeSession']['mode'] == 0) {
1869                        $timeModeAchievements[86] = true;
1870                    }
1871                } elseif ($r[$i]['TimeModeSession']['TimeModeAttempt'] == '1d') {
1872                    if ($r[$i]['TimeModeSession']['mode'] == 2) {
1873                        $timeModeAchievements[75] = true;
1874                    } elseif ($r[$i]['TimeModeSession']['mode'] == 1) {
1875                        $timeModeAchievements[81] = true;
1876                    } elseif ($r[$i]['TimeModeSession']['mode'] == 0) {
1877                        $timeModeAchievements[87] = true;
1878                    }
1879                }
1880            }
1881            if ($r[$i]['TimeModeSession']['points'] >= 850
1882            && ($r[$i]['TimeModeSession']['TimeModeAttempt'] == '4k' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '3k' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '2k' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '1k'
1883            || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '1d' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '2d' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '3d' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '4d'
1884            || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '5d')) {
1885                $timeModeAchievements[91] = true;
1886            }
1887            if ($r[$i]['TimeModeSession']['points'] >= 875
1888            && ($r[$i]['TimeModeSession']['TimeModeAttempt'] == '4k' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '3k' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '2k' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '1k'
1889            || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '1d' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '2d' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '3d' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '4d'
1890            || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '5d' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '5k' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '6k')) {
1891                $timeModeAchievements[90] = true;
1892            }
1893            if ($r[$i]['TimeModeSession']['points'] >= 900
1894            && ($r[$i]['TimeModeSession']['TimeModeAttempt'] == '4k' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '3k' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '2k' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '1k'
1895            || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '1d' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '2d' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '3d' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '4d'
1896            || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '5d' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '5k' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '6k' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '7k'
1897            || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '8k')) {
1898                $timeModeAchievements[89] = true;
1899            }
1900            if ($r[$i]['TimeModeSession']['points'] >= 950
1901            && ($r[$i]['TimeModeSession']['TimeModeAttempt'] == '4k' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '3k' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '2k' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '1k'
1902            || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '1d' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '2d' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '3d' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '4d'
1903            || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '5d' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '5k' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '6k' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '7k'
1904            || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '8k' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '9k' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '10k')) {
1905                $timeModeAchievements[88] = true;
1906            }
1907        }
1908        for ($i = 70; $i <= 91; $i++) {
1909            $achievementId = $i;
1910            if ($timeModeAchievements[$achievementId] == true && !isset($existingAs[$achievementId])) {
1911                $as['AchievementStatus']['achievement_id'] = $achievementId;
1912                ClassRegistry::init('AchievementStatus')->create();
1913                ClassRegistry::init('AchievementStatus')->save($as);
1914                array_push($updated, $achievementId);
1915            }
1916        }
1917        $updatedCount = count($updated);
1918        for ($i = 0; $i < $updatedCount; $i++) {
1919            $a = ClassRegistry::init('Achievement')->findById($updated[$i]);
1920            $updated[$i] = [];
1921            $updated[$i][0] = $a['Achievement']['name'];
1922            $updated[$i][1] = $a['Achievement']['description'];
1923            $updated[$i][2] = $a['Achievement']['image'];
1924            $updated[$i][3] = $a['Achievement']['color'];
1925            $updated[$i][4] = $a['Achievement']['xp'];
1926            $updated[$i][5] = $a['Achievement']['id'];
1927        }
1928
1929        return $updated;
1930    }
1931
1932    public static function checkRatingAchievements() {
1933        if (!Auth::isLoggedIn()) {
1934            return;
1935        }
1936
1937        $buffer = ClassRegistry::init('AchievementStatus')->find('all', ['conditions' => ['user_id' => Auth::getUserID()]]);
1938        if (!$buffer) {
1939            $buffer = [];
1940        }
1941        $existingAs = [];
1942        $bufferCount = count($buffer);
1943        for ($i = 0; $i < $bufferCount; $i++) {
1944            $existingAs[$buffer[$i]['AchievementStatus']['achievement_id']] = $buffer[$i];
1945        }
1946        $as = [];
1947        $as['AchievementStatus']['user_id'] = Auth::getUserID();
1948        $updated = [];
1949
1950        $achievementId = 59;
1951        $currentElo = Auth::getUser()['rating'];
1952        if ($currentElo >= 1500 && !isset($existingAs[$achievementId])) {
1953            $as['AchievementStatus']['achievement_id'] = $achievementId;
1954            ClassRegistry::init('AchievementStatus')->create();
1955            ClassRegistry::init('AchievementStatus')->save($as);
1956            array_push($updated, $achievementId);
1957        }
1958        $achievementId = 60;
1959        if ($currentElo >= 1600 && !isset($existingAs[$achievementId])) {
1960            $as['AchievementStatus']['achievement_id'] = $achievementId;
1961            ClassRegistry::init('AchievementStatus')->create();
1962            ClassRegistry::init('AchievementStatus')->save($as);
1963            array_push($updated, $achievementId);
1964        }
1965        $achievementId = 61;
1966        if ($currentElo >= 1700 && !isset($existingAs[$achievementId])) {
1967            $as['AchievementStatus']['achievement_id'] = $achievementId;
1968            ClassRegistry::init('AchievementStatus')->create();
1969            ClassRegistry::init('AchievementStatus')->save($as);
1970            array_push($updated, $achievementId);
1971        }
1972        $achievementId = 62;
1973        if ($currentElo >= 1800 && !isset($existingAs[$achievementId])) {
1974            $as['AchievementStatus']['achievement_id'] = $achievementId;
1975            ClassRegistry::init('AchievementStatus')->create();
1976            ClassRegistry::init('AchievementStatus')->save($as);
1977            array_push($updated, $achievementId);
1978        }
1979        $achievementId = 63;
1980        if ($currentElo >= 1900 && !isset($existingAs[$achievementId])) {
1981            $as['AchievementStatus']['achievement_id'] = $achievementId;
1982            ClassRegistry::init('AchievementStatus')->create();
1983            ClassRegistry::init('AchievementStatus')->save($as);
1984            array_push($updated, $achievementId);
1985        }
1986        $achievementId = 64;
1987        if ($currentElo >= 2000 && !isset($existingAs[$achievementId])) {
1988            $as['AchievementStatus']['achievement_id'] = $achievementId;
1989            ClassRegistry::init('AchievementStatus')->create();
1990            ClassRegistry::init('AchievementStatus')->save($as);
1991            array_push($updated, $achievementId);
1992        }
1993        $achievementId = 65;
1994        if ($currentElo >= 2100 && !isset($existingAs[$achievementId])) {
1995            $as['AchievementStatus']['achievement_id'] = $achievementId;
1996            ClassRegistry::init('AchievementStatus')->create();
1997            ClassRegistry::init('AchievementStatus')->save($as);
1998            array_push($updated, $achievementId);
1999        }
2000        $achievementId = 66;
2001        if ($currentElo >= 2200 && !isset($existingAs[$achievementId])) {
2002            $as['AchievementStatus']['achievement_id'] = $achievementId;
2003            ClassRegistry::init('AchievementStatus')->create();
2004            ClassRegistry::init('AchievementStatus')->save($as);
2005            array_push($updated, $achievementId);
2006        }
2007        $achievementId = 67;
2008        if ($currentElo >= 2300 && !isset($existingAs[$achievementId])) {
2009            $as['AchievementStatus']['achievement_id'] = $achievementId;
2010            ClassRegistry::init('AchievementStatus')->create();
2011            ClassRegistry::init('AchievementStatus')->save($as);
2012            array_push($updated, $achievementId);
2013        }
2014        $achievementId = 68;
2015        if ($currentElo >= 2400 && !isset($existingAs[$achievementId])) {
2016            $as['AchievementStatus']['achievement_id'] = $achievementId;
2017            ClassRegistry::init('AchievementStatus')->create();
2018            ClassRegistry::init('AchievementStatus')->save($as);
2019            array_push($updated, $achievementId);
2020        }
2021        $achievementId = 69;
2022        if ($currentElo >= 2500 && !isset($existingAs[$achievementId])) {
2023            $as['AchievementStatus']['achievement_id'] = $achievementId;
2024            ClassRegistry::init('AchievementStatus')->create();
2025            ClassRegistry::init('AchievementStatus')->save($as);
2026            array_push($updated, $achievementId);
2027        }
2028        $updatedCount = count($updated);
2029        for ($i = 0; $i < $updatedCount; $i++) {
2030            $a = ClassRegistry::init('Achievement')->findById($updated[$i]);
2031            $updated[$i] = [];
2032            $updated[$i][0] = $a['Achievement']['name'];
2033            $updated[$i][1] = $a['Achievement']['description'];
2034            $updated[$i][2] = $a['Achievement']['image'];
2035            $updated[$i][3] = $a['Achievement']['color'];
2036            $updated[$i][4] = $a['Achievement']['xp'];
2037            $updated[$i][5] = $a['Achievement']['id'];
2038        }
2039
2040        return $updated;
2041    }
2042
2043    public static function checkLevelAchievements() {
2044        if (!Auth::isLoggedIn()) {
2045            return;
2046        }
2047        $buffer = ClassRegistry::init('AchievementStatus')->find('all', ['conditions' => ['user_id' => Auth::getUserID()]]);
2048        if (!$buffer) {
2049            $buffer = [];
2050        }
2051        $existingAs = [];
2052        $bufferCount = count($buffer);
2053        for ($i = 0; $i < $bufferCount; $i++) {
2054            $existingAs[$buffer[$i]['AchievementStatus']['achievement_id']] = $buffer[$i];
2055        }
2056        $as = [];
2057        $as['AchievementStatus']['user_id'] = Auth::getUserID();
2058        $updated = [];
2059
2060        $achievementId = 36;
2061        $userLevel = Auth::getUser()['level'];
2062        if ($userLevel >= 10 && !isset($existingAs[$achievementId])) {
2063            $as['AchievementStatus']['achievement_id'] = $achievementId;
2064            ClassRegistry::init('AchievementStatus')->create();
2065            ClassRegistry::init('AchievementStatus')->save($as);
2066            array_push($updated, $achievementId);
2067        }
2068        $achievementId = 37;
2069        if ($userLevel >= 20 && !isset($existingAs[$achievementId])) {
2070            $as['AchievementStatus']['achievement_id'] = $achievementId;
2071            ClassRegistry::init('AchievementStatus')->create();
2072            ClassRegistry::init('AchievementStatus')->save($as);
2073            array_push($updated, $achievementId);
2074        }
2075        $achievementId = 38;
2076        if ($userLevel >= 30 && !isset($existingAs[$achievementId])) {
2077            $as['AchievementStatus']['achievement_id'] = $achievementId;
2078            ClassRegistry::init('AchievementStatus')->create();
2079            ClassRegistry::init('AchievementStatus')->save($as);
2080            array_push($updated, $achievementId);
2081        }
2082        $achievementId = 39;
2083        if ($userLevel >= 40 && !isset($existingAs[$achievementId])) {
2084            $as['AchievementStatus']['achievement_id'] = $achievementId;
2085            ClassRegistry::init('AchievementStatus')->create();
2086            ClassRegistry::init('AchievementStatus')->save($as);
2087            array_push($updated, $achievementId);
2088        }
2089        $achievementId = 40;
2090        if ($userLevel >= 50 && !isset($existingAs[$achievementId])) {
2091            $as['AchievementStatus']['achievement_id'] = $achievementId;
2092            ClassRegistry::init('AchievementStatus')->create();
2093            ClassRegistry::init('AchievementStatus')->save($as);
2094            array_push($updated, $achievementId);
2095        }
2096        $achievementId = 41;
2097        if ($userLevel >= 60 && !isset($existingAs[$achievementId])) {
2098            $as['AchievementStatus']['achievement_id'] = $achievementId;
2099            ClassRegistry::init('AchievementStatus')->create();
2100            ClassRegistry::init('AchievementStatus')->save($as);
2101            array_push($updated, $achievementId);
2102        }
2103        $achievementId = 42;
2104        if ($userLevel >= 70 && !isset($existingAs[$achievementId])) {
2105            $as['AchievementStatus']['achievement_id'] = $achievementId;
2106            ClassRegistry::init('AchievementStatus')->create();
2107            ClassRegistry::init('AchievementStatus')->save($as);
2108            array_push($updated, $achievementId);
2109        }
2110        $achievementId = 43;
2111        if ($userLevel >= 80 && !isset($existingAs[$achievementId])) {
2112            $as['AchievementStatus']['achievement_id'] = $achievementId;
2113            ClassRegistry::init('AchievementStatus')->create();
2114            ClassRegistry::init('AchievementStatus')->save($as);
2115            array_push($updated, $achievementId);
2116        }
2117        $achievementId = 44;
2118        if ($userLevel >= 90 && !isset($existingAs[$achievementId])) {
2119            $as['AchievementStatus']['achievement_id'] = $achievementId;
2120            ClassRegistry::init('AchievementStatus')->create();
2121            ClassRegistry::init('AchievementStatus')->save($as);
2122            array_push($updated, $achievementId);
2123        }
2124        $achievementId = 45;
2125        if ($userLevel >= 100 && !isset($existingAs[$achievementId])) {
2126            $as['AchievementStatus']['achievement_id'] = $achievementId;
2127            ClassRegistry::init('AchievementStatus')->create();
2128            ClassRegistry::init('AchievementStatus')->save($as);
2129            array_push($updated, $achievementId);
2130        }
2131        $achievementId = 100;
2132        if (Auth::hasPremium() && !isset($existingAs[$achievementId])) {
2133            $as['AchievementStatus']['achievement_id'] = $achievementId;
2134            ClassRegistry::init('AchievementStatus')->create();
2135            ClassRegistry::init('AchievementStatus')->save($as);
2136            array_push($updated, $achievementId);
2137        }
2138        $updatedCount = count($updated);
2139        for ($i = 0; $i < $updatedCount; $i++) {
2140            $a = ClassRegistry::init('Achievement')->findById($updated[$i]);
2141            $updated[$i] = [];
2142            $updated[$i][0] = $a['Achievement']['name'];
2143            $updated[$i][1] = $a['Achievement']['description'];
2144            $updated[$i][2] = $a['Achievement']['image'];
2145            $updated[$i][3] = $a['Achievement']['color'];
2146            $updated[$i][4] = $a['Achievement']['xp'];
2147            $updated[$i][5] = $a['Achievement']['id'];
2148        }
2149
2150        return $updated;
2151    }
2152
2153    protected function checkSetCompletedAchievements() {
2154        $this->loadModel('Set');
2155        $this->loadModel('Tsumego');
2156        $this->loadModel('Achievement');
2157        $this->loadModel('AchievementStatus');
2158        $this->loadModel('AchievementCondition');
2159
2160        $ac = ClassRegistry::init('AchievementCondition')->find('first', [
2161            'order' => 'value DESC',
2162            'conditions' => [
2163                'user_id' => Auth::getUserID(),
2164                'category' => 'set',
2165            ],
2166        ]);
2167
2168        if (!$ac) {
2169            return [];
2170        }
2171
2172        $buffer = ClassRegistry::init('AchievementStatus')->find('all', ['conditions' => ['user_id' => Auth::getUserID()]]);
2173        if (!$buffer) {
2174            $buffer = [];
2175        }
2176        $existingAs = [];
2177        $bufferCount = count($buffer);
2178        for ($i = 0; $i < $bufferCount; $i++) {
2179            $existingAs[$buffer[$i]['AchievementStatus']['achievement_id']] = $buffer[$i];
2180        }
2181        $as = [];
2182        $as['AchievementStatus']['user_id'] = Auth::getUserID();
2183        $updated = [];
2184
2185        $achievementId = 47;
2186        if ($ac['AchievementCondition']['value'] >= 10 && !isset($existingAs[$achievementId])) {
2187            $as['AchievementStatus']['achievement_id'] = $achievementId;
2188            ClassRegistry::init('AchievementStatus')->create();
2189            ClassRegistry::init('AchievementStatus')->save($as);
2190            array_push($updated, $achievementId);
2191        }
2192        $achievementId = 48;
2193        if ($ac['AchievementCondition']['value'] >= 20 && !isset($existingAs[$achievementId])) {
2194            $as['AchievementStatus']['achievement_id'] = $achievementId;
2195            ClassRegistry::init('AchievementStatus')->create();
2196            ClassRegistry::init('AchievementStatus')->save($as);
2197            array_push($updated, $achievementId);
2198        }
2199        $achievementId = 49;
2200        if ($ac['AchievementCondition']['value'] >= 30 && !isset($existingAs[$achievementId])) {
2201            $as['AchievementStatus']['achievement_id'] = $achievementId;
2202            ClassRegistry::init('AchievementStatus')->create();
2203            ClassRegistry::init('AchievementStatus')->save($as);
2204            array_push($updated, $achievementId);
2205        }
2206        $achievementId = 50;
2207        if ($ac['AchievementCondition']['value'] >= 40 && !isset($existingAs[$achievementId])) {
2208            $as['AchievementStatus']['achievement_id'] = $achievementId;
2209            ClassRegistry::init('AchievementStatus')->create();
2210            ClassRegistry::init('AchievementStatus')->save($as);
2211            array_push($updated, $achievementId);
2212        }
2213        $achievementId = 51;
2214        if ($ac['AchievementCondition']['value'] >= 50 && !isset($existingAs[$achievementId])) {
2215            $as['AchievementStatus']['achievement_id'] = $achievementId;
2216            ClassRegistry::init('AchievementStatus')->create();
2217            ClassRegistry::init('AchievementStatus')->save($as);
2218            array_push($updated, $achievementId);
2219        }
2220        $achievementId = 52;
2221        if ($ac['AchievementCondition']['value'] >= 60 && !isset($existingAs[$achievementId])) {
2222            $as['AchievementStatus']['achievement_id'] = $achievementId;
2223            ClassRegistry::init('AchievementStatus')->create();
2224            ClassRegistry::init('AchievementStatus')->save($as);
2225            array_push($updated, $achievementId);
2226        }
2227        $updatedCount = count($updated);
2228        for ($i = 0; $i < $updatedCount; $i++) {
2229            $a = ClassRegistry::init('Achievement')->findById($updated[$i]);
2230            $updated[$i] = [];
2231            $updated[$i][0] = $a['Achievement']['name'];
2232            $updated[$i][1] = $a['Achievement']['description'];
2233            $updated[$i][2] = $a['Achievement']['image'];
2234            $updated[$i][3] = $a['Achievement']['color'];
2235            $updated[$i][4] = $a['Achievement']['xp'];
2236            $updated[$i][5] = $a['Achievement']['id'];
2237        }
2238
2239        return $updated;
2240    }
2241
2242    protected function setAchievementSpecial($s = null) {
2243        $this->loadModel('Set');
2244        $this->loadModel('Tsumego');
2245        $this->loadModel('TsumegoStatus');
2246        $this->loadModel('Achievement');
2247        $this->loadModel('AchievementStatus');
2248        $this->loadModel('SetConnection');
2249
2250        $buffer = ClassRegistry::init('AchievementStatus')->find('all', ['conditions' => ['user_id' => Auth::getUserID()]]);
2251        if (!$buffer) {
2252            $buffer = [];
2253        }
2254        $existingAs = [];
2255        $bufferCount = count($buffer);
2256        for ($i = 0; $i < $bufferCount; $i++) {
2257            $existingAs[$buffer[$i]['AchievementStatus']['achievement_id']] = $buffer[$i];
2258        }
2259        $as = [];
2260        $as['AchievementStatus']['user_id'] = Auth::getUserID();
2261        $updated = [];
2262
2263        $tsIds = [];
2264        $completed = '';
2265        if ($s == 'cc1') {
2266            $ts1 = TsumegoUtil::collectTsumegosFromSet(50);
2267            $ts2 = TsumegoUtil::collectTsumegosFromSet(52);
2268            $ts3 = TsumegoUtil::collectTsumegosFromSet(53);
2269            $ts4 = TsumegoUtil::collectTsumegosFromSet(54);
2270            $ts = array_merge($ts1, $ts2, $ts3, $ts4);
2271            $tsCount = count($ts);
2272            for ($i = 0; $i < $tsCount; $i++) {
2273                array_push($tsIds, $ts[$i]['Tsumego']['id']);
2274            }
2275            $uts = $this->TsumegoStatus->find('all', [
2276                'conditions' => [
2277                    'user_id' => Auth::getUserID(),
2278                    'tsumego_id' => $tsIds,
2279                ],
2280            ]);
2281            if (!$uts) {
2282                $uts = [];
2283            }
2284            $counter = 0;
2285            $utsCount = count($uts);
2286            for ($j = 0; $j < $utsCount; $j++) {
2287                for ($k = 0; $k < $tsCount; $k++) {
2288                    if ($uts[$j]['TsumegoStatus']['tsumego_id'] == $ts[$k]['Tsumego']['id'] && ($uts[$j]['TsumegoStatus']['status'] == 'S'
2289                    || $uts[$j]['TsumegoStatus']['status'] == 'W' || $uts[$j]['TsumegoStatus']['status'] == 'C')) {
2290                        $counter++;
2291                    }
2292                }
2293            }
2294            if ($counter == count($ts)) {
2295                $completed = $s;
2296            }
2297        } elseif ($s == 'cc2') {
2298            $ts1 = TsumegoUtil::collectTsumegosFromSet(41);
2299            $ts2 = TsumegoUtil::collectTsumegosFromSet(49);
2300            $ts3 = TsumegoUtil::collectTsumegosFromSet(65);
2301            $ts4 = TsumegoUtil::collectTsumegosFromSet(66);
2302            $ts = array_merge($ts1, $ts2, $ts3, $ts4);
2303            $tsCount = count($ts);
2304            for ($i = 0; $i < $tsCount; $i++) {
2305                array_push($tsIds, $ts[$i]['Tsumego']['id']);
2306            }
2307            $uts = $this->TsumegoStatus->find('all', [
2308                'conditions' => [
2309                    'user_id' => Auth::getUserID(),
2310                    'tsumego_id' => $tsIds,
2311                ],
2312            ]);
2313            if (!$uts) {
2314                $uts = [];
2315            }
2316            $counter = 0;
2317            $utsCount = count($uts);
2318            for ($j = 0; $j < $utsCount; $j++) {
2319                for ($k = 0; $k < $tsCount; $k++) {
2320                    if ($uts[$j]['TsumegoStatus']['tsumego_id'] == $ts[$k]['Tsumego']['id'] && ($uts[$j]['TsumegoStatus']['status'] == 'S'
2321                    || $uts[$j]['TsumegoStatus']['status'] == 'W' || $uts[$j]['TsumegoStatus']['status'] == 'C')) {
2322                        $counter++;
2323                    }
2324                }
2325            }
2326            if ($counter == count($ts)) {
2327                $completed = $s;
2328            }
2329        } elseif ($s == 'cc3') {
2330            $ts1 = TsumegoUtil::collectTsumegosFromSet(186);
2331            $ts2 = TsumegoUtil::collectTsumegosFromSet(187);
2332            $ts3 = TsumegoUtil::collectTsumegosFromSet(196);
2333            $ts4 = TsumegoUtil::collectTsumegosFromSet(203);
2334            $ts = array_merge($ts1, $ts2, $ts3, $ts4);
2335            $tsCount = count($ts);
2336            for ($i = 0; $i < $tsCount; $i++) {
2337                array_push($tsIds, $ts[$i]['Tsumego']['id']);
2338            }
2339            $uts = $this->TsumegoStatus->find('all', [
2340                'conditions' => [
2341                    'user_id' => Auth::getUserID(),
2342                    'tsumego_id' => $tsIds,
2343                ],
2344            ]);
2345            if (!$uts) {
2346                $uts = [];
2347            }
2348            $counter = 0;
2349            $utsCount = count($uts);
2350            for ($j = 0; $j < $utsCount; $j++) {
2351                for ($k = 0; $k < $tsCount; $k++) {
2352                    if ($uts[$j]['TsumegoStatus']['tsumego_id'] == $ts[$k]['Tsumego']['id'] && ($uts[$j]['TsumegoStatus']['status'] == 'S'
2353                    || $uts[$j]['TsumegoStatus']['status'] == 'W' || $uts[$j]['TsumegoStatus']['status'] == 'C')) {
2354                        $counter++;
2355                    }
2356                }
2357            }
2358            if ($counter == count($ts)) {
2359                $completed = $s;
2360            }
2361        } elseif ($s == '1000w1') {
2362            $ts1 = TsumegoUtil::collectTsumegosFromSet(190);
2363            $ts2 = TsumegoUtil::collectTsumegosFromSet(193);
2364            $ts3 = TsumegoUtil::collectTsumegosFromSet(198);
2365            $ts = array_merge($ts1, $ts2, $ts3);
2366            $tsCount = count($ts);
2367            for ($i = 0; $i < $tsCount; $i++) {
2368                array_push($tsIds, $ts[$i]['Tsumego']['id']);
2369            }
2370            $uts = $this->TsumegoStatus->find('all', [
2371                'conditions' => [
2372                    'user_id' => Auth::getUserID(),
2373                    'tsumego_id' => $tsIds,
2374                ],
2375            ]);
2376            if (!$uts) {
2377                $uts = [];
2378            }
2379            $counter = 0;
2380            $utsCount = count($uts);
2381            for ($j = 0; $j < $utsCount; $j++) {
2382                for ($k = 0; $k < $tsCount; $k++) {
2383                    if ($uts[$j]['TsumegoStatus']['tsumego_id'] == $ts[$k]['Tsumego']['id'] && ($uts[$j]['TsumegoStatus']['status'] == 'S'
2384                    || $uts[$j]['TsumegoStatus']['status'] == 'W' || $uts[$j]['TsumegoStatus']['status'] == 'C')) {
2385                        $counter++;
2386                    }
2387                }
2388            }
2389            if ($counter == count($ts)) {
2390                $completed = $s;
2391            }
2392        } elseif ($s == '1000w2') {
2393            $ts = TsumegoUtil::collectTsumegosFromSet(216);
2394            $tsCount = count($ts);
2395            for ($i = 0; $i < $tsCount; $i++) {
2396                array_push($tsIds, $ts[$i]['Tsumego']['id']);
2397            }
2398            $uts = $this->TsumegoStatus->find('all', [
2399                'conditions' => [
2400                    'user_id' => Auth::getUserID(),
2401                    'tsumego_id' => $tsIds,
2402                ],
2403            ]);
2404            if (!$uts) {
2405                $uts = [];
2406            }
2407            $counter = 0;
2408            $utsCount = count($uts);
2409            for ($j = 0; $j < $utsCount; $j++) {
2410                for ($k = 0; $k < $tsCount; $k++) {
2411                    if ($uts[$j]['TsumegoStatus']['tsumego_id'] == $ts[$k]['Tsumego']['id'] && ($uts[$j]['TsumegoStatus']['status'] == 'S'
2412                    || $uts[$j]['TsumegoStatus']['status'] == 'W' || $uts[$j]['TsumegoStatus']['status'] == 'C')) {
2413                        $counter++;
2414                    }
2415                }
2416            }
2417            if ($counter == count($ts)) {
2418                $completed = $s;
2419            }
2420        }
2421
2422        $achievementId = 92;
2423        if ($completed == 'cc1' && !isset($existingAs[$achievementId])) {
2424            $as['AchievementStatus']['achievement_id'] = $achievementId;
2425            ClassRegistry::init('AchievementStatus')->create();
2426            ClassRegistry::init('AchievementStatus')->save($as);
2427            array_push($updated, $achievementId);
2428        }
2429        $achievementId = 93;
2430        if ($completed == 'cc2' && !isset($existingAs[$achievementId])) {
2431            $as['AchievementStatus']['achievement_id'] = $achievementId;
2432            ClassRegistry::init('AchievementStatus')->create();
2433            ClassRegistry::init('AchievementStatus')->save($as);
2434            array_push($updated, $achievementId);
2435        }
2436        $achievementId = 94;
2437        if ($completed == 'cc3' && !isset($existingAs[$achievementId])) {
2438            $as['AchievementStatus']['achievement_id'] = $achievementId;
2439            ClassRegistry::init('AchievementStatus')->create();
2440            ClassRegistry::init('AchievementStatus')->save($as);
2441            array_push($updated, $achievementId);
2442        }
2443        $achievementId = 95;
2444        if ($completed == '1000w1' && !isset($existingAs[$achievementId])) {
2445            $as['AchievementStatus']['achievement_id'] = $achievementId;
2446            ClassRegistry::init('AchievementStatus')->create();
2447            ClassRegistry::init('AchievementStatus')->save($as);
2448            array_push($updated, $achievementId);
2449        }
2450        $achievementId = 115;
2451        if ($completed == '1000w2' && !isset($existingAs[$achievementId])) {
2452            $as['AchievementStatus']['achievement_id'] = $achievementId;
2453            ClassRegistry::init('AchievementStatus')->create();
2454            ClassRegistry::init('AchievementStatus')->save($as);
2455            array_push($updated, $achievementId);
2456        }
2457        $updatedCount = count($updated);
2458        for ($i = 0; $i < $updatedCount; $i++) {
2459            $a = ClassRegistry::init('Achievement')->findById($updated[$i]);
2460            $updated[$i] = [];
2461            $updated[$i][0] = $a['Achievement']['name'];
2462            $updated[$i][1] = $a['Achievement']['description'];
2463            $updated[$i][2] = $a['Achievement']['image'];
2464            $updated[$i][3] = $a['Achievement']['color'];
2465            $updated[$i][4] = $a['Achievement']['xp'];
2466            $updated[$i][5] = $a['Achievement']['id'];
2467        }
2468
2469        return $updated;
2470    }
2471
2472    protected function checkSetAchievements($sid = null) {
2473        $this->loadModel('Set');
2474        $this->loadModel('Tsumego');
2475        $this->loadModel('Achievement');
2476        $this->loadModel('AchievementStatus');
2477        $this->loadModel('AchievementCondition');
2478
2479        //$tNum = count($this->Tsumego->find('all', array('conditions' => array('set_id' => $sid))));
2480        $tNum = count(TsumegoUtil::collectTsumegosFromSet($sid));
2481        $s = $this->Set->findById($sid);
2482        $acA = ClassRegistry::init('AchievementCondition')->find('first', [
2483            'order' => 'value DESC',
2484            'conditions' => [
2485                'set_id' => $sid,
2486                'user_id' => Auth::getUserID(),
2487                'category' => '%',
2488            ],
2489        ]);
2490        if (!$acA) {
2491            return [];
2492        }
2493        $acS = ClassRegistry::init('AchievementCondition')->find('first', [
2494            'order' => 'value ASC',
2495            'conditions' => [
2496                'set_id' => $sid,
2497                'user_id' => Auth::getUserID(),
2498                'category' => 's',
2499            ],
2500        ]);
2501        $buffer = ClassRegistry::init('AchievementStatus')->find('all', ['conditions' => ['user_id' => Auth::getUserID()]]);
2502        if (!$buffer) {
2503            $buffer = [];
2504        }
2505        $existingAs = [];
2506        $bufferCount = count($buffer);
2507        for ($i = 0; $i < $bufferCount; $i++) {
2508            $existingAs[$buffer[$i]['AchievementStatus']['achievement_id']] = $buffer[$i];
2509        }
2510        $as = [];
2511        $as['AchievementStatus']['user_id'] = Auth::getUserID();
2512        $updated = [];
2513
2514        $achievementId = 99;
2515        if ($sid == -1 && !isset($existingAs[$achievementId])) {
2516            $as['AchievementStatus']['achievement_id'] = $achievementId;
2517            ClassRegistry::init('AchievementStatus')->create();
2518            ClassRegistry::init('AchievementStatus')->save($as);
2519            array_push($updated, $achievementId);
2520        }
2521        if ($tNum >= 100) {
2522            if ($s['Set']['difficulty'] < 1300) {
2523                $achievementId = 12;
2524                if ($acA['AchievementCondition']['value'] >= 75 && !isset($existingAs[$achievementId])) {
2525                    $as['AchievementStatus']['achievement_id'] = $achievementId;
2526                    ClassRegistry::init('AchievementStatus')->create();
2527                    ClassRegistry::init('AchievementStatus')->save($as);
2528                    array_push($updated, $achievementId);
2529                }
2530                $achievementId = 13;
2531                if ($acA['AchievementCondition']['value'] >= 85 && !isset($existingAs[$achievementId])) {
2532                    $as['AchievementStatus']['achievement_id'] = $achievementId;
2533                    ClassRegistry::init('AchievementStatus')->create();
2534                    ClassRegistry::init('AchievementStatus')->save($as);
2535                    array_push($updated, $achievementId);
2536                }
2537                $achievementId = 14;
2538                if ($acA['AchievementCondition']['value'] >= 95 && !isset($existingAs[$achievementId])) {
2539                    $as['AchievementStatus']['achievement_id'] = $achievementId;
2540                    ClassRegistry::init('AchievementStatus')->create();
2541                    ClassRegistry::init('AchievementStatus')->save($as);
2542                    array_push($updated, $achievementId);
2543                }
2544                $achievementId = 24;
2545                if ($acS['AchievementCondition']['value'] < 15 && !isset($existingAs[$achievementId])) {
2546                    $as['AchievementStatus']['achievement_id'] = $achievementId;
2547                    ClassRegistry::init('AchievementStatus')->create();
2548                    ClassRegistry::init('AchievementStatus')->save($as);
2549                    array_push($updated, $achievementId);
2550                }
2551                $achievementId = 25;
2552                if ($acS['AchievementCondition']['value'] < 10 && !isset($existingAs[$achievementId])) {
2553                    $as['AchievementStatus']['achievement_id'] = $achievementId;
2554                    ClassRegistry::init('AchievementStatus')->create();
2555                    ClassRegistry::init('AchievementStatus')->save($as);
2556                    array_push($updated, $achievementId);
2557                }
2558                $achievementId = 26;
2559                if ($acS['AchievementCondition']['value'] < 5 && !isset($existingAs[$achievementId])) {
2560                    $as['AchievementStatus']['achievement_id'] = $achievementId;
2561                    ClassRegistry::init('AchievementStatus')->create();
2562                    ClassRegistry::init('AchievementStatus')->save($as);
2563                    array_push($updated, $achievementId);
2564                }
2565            } elseif ($s['Set']['difficulty'] >= 1300 && $s['Set']['difficulty'] < 1500) {
2566                $achievementId = 15;
2567                if ($acA['AchievementCondition']['value'] >= 75 && !isset($existingAs[$achievementId])) {
2568                    $as['AchievementStatus']['achievement_id'] = $achievementId;
2569                    ClassRegistry::init('AchievementStatus')->create();
2570                    ClassRegistry::init('AchievementStatus')->save($as);
2571                    array_push($updated, $achievementId);
2572                }
2573                $achievementId = 16;
2574                if ($acA['AchievementCondition']['value'] >= 85 && !isset($existingAs[$achievementId])) {
2575                    $as['AchievementStatus']['achievement_id'] = $achievementId;
2576                    ClassRegistry::init('AchievementStatus')->create();
2577                    ClassRegistry::init('AchievementStatus')->save($as);
2578                    array_push($updated, $achievementId);
2579                }
2580                $achievementId = 17;
2581                if ($acA['AchievementCondition']['value'] >= 95 && !isset($existingAs[$achievementId])) {
2582                    $as['AchievementStatus']['achievement_id'] = $achievementId;
2583                    ClassRegistry::init('AchievementStatus')->create();
2584                    ClassRegistry::init('AchievementStatus')->save($as);
2585                    array_push($updated, $achievementId);
2586                }
2587                $achievementId = 27;
2588                if ($acS['AchievementCondition']['value'] < 18 && !isset($existingAs[$achievementId])) {
2589                    $as['AchievementStatus']['achievement_id'] = $achievementId;
2590                    ClassRegistry::init('AchievementStatus')->create();
2591                    ClassRegistry::init('AchievementStatus')->save($as);
2592                    array_push($updated, $achievementId);
2593                }
2594                $achievementId = 28;
2595                if ($acS['AchievementCondition']['value'] < 13 && !isset($existingAs[$achievementId])) {
2596                    $as['AchievementStatus']['achievement_id'] = $achievementId;
2597                    ClassRegistry::init('AchievementStatus')->create();
2598                    ClassRegistry::init('AchievementStatus')->save($as);
2599                    array_push($updated, $achievementId);
2600                }
2601                $achievementId = 29;
2602                if ($acS['AchievementCondition']['value'] < 8 && !isset($existingAs[$achievementId])) {
2603                    $as['AchievementStatus']['achievement_id'] = $achievementId;
2604                    ClassRegistry::init('AchievementStatus')->create();
2605                    ClassRegistry::init('AchievementStatus')->save($as);
2606                    array_push($updated, $achievementId);
2607                }
2608            } elseif ($s['Set']['difficulty'] >= 1500 && $s['Set']['difficulty'] < 1700) {
2609                $achievementId = 18;
2610                if ($acA['AchievementCondition']['value'] >= 75 && !isset($existingAs[$achievementId])) {
2611                    $as['AchievementStatus']['achievement_id'] = $achievementId;
2612                    ClassRegistry::init('AchievementStatus')->create();
2613                    ClassRegistry::init('AchievementStatus')->save($as);
2614                    array_push($updated, $achievementId);
2615                }
2616                $achievementId = 19;
2617                if ($acA['AchievementCondition']['value'] >= 85 && !isset($existingAs[$achievementId])) {
2618                    $as['AchievementStatus']['achievement_id'] = $achievementId;
2619                    ClassRegistry::init('AchievementStatus')->create();
2620                    ClassRegistry::init('AchievementStatus')->save($as);
2621                    array_push($updated, $achievementId);
2622                }
2623                $achievementId = 20;
2624                if ($acA['AchievementCondition']['value'] >= 95 && !isset($existingAs[$achievementId])) {
2625                    $as['AchievementStatus']['achievement_id'] = $achievementId;
2626                    ClassRegistry::init('AchievementStatus')->create();
2627                    ClassRegistry::init('AchievementStatus')->save($as);
2628                    array_push($updated, $achievementId);
2629                }
2630                $achievementId = 30;
2631                if ($acS['AchievementCondition']['value'] < 30 && !isset($existingAs[$achievementId])) {
2632                    $as['AchievementStatus']['achievement_id'] = $achievementId;
2633                    ClassRegistry::init('AchievementStatus')->create();
2634                    ClassRegistry::init('AchievementStatus')->save($as);
2635                    array_push($updated, $achievementId);
2636                }
2637                $achievementId = 31;
2638                if ($acS['AchievementCondition']['value'] < 20 && !isset($existingAs[$achievementId])) {
2639                    $as['AchievementStatus']['achievement_id'] = $achievementId;
2640                    ClassRegistry::init('AchievementStatus')->create();
2641                    ClassRegistry::init('AchievementStatus')->save($as);
2642                    array_push($updated, $achievementId);
2643                }
2644                $achievementId = 32;
2645                if ($acS['AchievementCondition']['value'] < 10 && !isset($existingAs[$achievementId])) {
2646                    $as['AchievementStatus']['achievement_id'] = $achievementId;
2647                    ClassRegistry::init('AchievementStatus')->create();
2648                    ClassRegistry::init('AchievementStatus')->save($as);
2649                    array_push($updated, $achievementId);
2650                }
2651            } else {
2652                $achievementId = 21;
2653                if ($acA['AchievementCondition']['value'] >= 75 && !isset($existingAs[$achievementId])) {
2654                    $as['AchievementStatus']['achievement_id'] = $achievementId;
2655                    ClassRegistry::init('AchievementStatus')->create();
2656                    ClassRegistry::init('AchievementStatus')->save($as);
2657                    array_push($updated, $achievementId);
2658                }
2659                $achievementId = 22;
2660                if ($acA['AchievementCondition']['value'] >= 85 && !isset($existingAs[$achievementId])) {
2661                    $as['AchievementStatus']['achievement_id'] = $achievementId;
2662                    ClassRegistry::init('AchievementStatus')->create();
2663                    ClassRegistry::init('AchievementStatus')->save($as);
2664                    array_push($updated, $achievementId);
2665                }
2666                $achievementId = 23;
2667                if ($acA['AchievementCondition']['value'] >= 95 && !isset($existingAs[$achievementId])) {
2668                    $as['AchievementStatus']['achievement_id'] = $achievementId;
2669                    ClassRegistry::init('AchievementStatus')->create();
2670                    ClassRegistry::init('AchievementStatus')->save($as);
2671                    array_push($updated, $achievementId);
2672                }
2673                $achievementId = 33;
2674                if ($acS['AchievementCondition']['value'] < 30 && !isset($existingAs[$achievementId])) {
2675                    $as['AchievementStatus']['achievement_id'] = $achievementId;
2676                    ClassRegistry::init('AchievementStatus')->create();
2677                    ClassRegistry::init('AchievementStatus')->save($as);
2678                    array_push($updated, $achievementId);
2679                }
2680                $achievementId = 34;
2681                if ($acS['AchievementCondition']['value'] < 20 && !isset($existingAs[$achievementId])) {
2682                    $as['AchievementStatus']['achievement_id'] = $achievementId;
2683                    ClassRegistry::init('AchievementStatus')->create();
2684                    ClassRegistry::init('AchievementStatus')->save($as);
2685                    array_push($updated, $achievementId);
2686                }
2687                $achievementId = 35;
2688                if ($acS['AchievementCondition']['value'] < 10 && !isset($existingAs[$achievementId])) {
2689                    $as['AchievementStatus']['achievement_id'] = $achievementId;
2690                    ClassRegistry::init('AchievementStatus')->create();
2691                    ClassRegistry::init('AchievementStatus')->save($as);
2692                    array_push($updated, $achievementId);
2693                }
2694            }
2695            $achievementId = 46;
2696            if ($acA['AchievementCondition']['value'] >= 100) {
2697                $ac100 = ClassRegistry::init('AchievementCondition')->find('all', ['conditions' => ['user_id' => Auth::getUserID(), 'category' => '%', 'value >=' => 100]]);
2698                if (!$ac100) {
2699                    $ac100 = [];
2700                }
2701                $ac100counter = 0;
2702                $ac100Count = count($ac100);
2703                for ($j = 0; $j < $ac100Count; $j++) {
2704                    if (count(TsumegoUtil::collectTsumegosFromSet($ac100[$j]['AchievementCondition']['set_id'])) >= 100) {
2705                        $ac100counter++;
2706                    }
2707                }
2708                $as100 = ClassRegistry::init('AchievementStatus')->find('first', ['conditions' => ['user_id' => Auth::getUserID(), 'achievement_id' => $achievementId]]);
2709                if ($as100 == null) {
2710                    $as['AchievementStatus']['achievement_id'] = $achievementId;
2711                    $as['AchievementStatus']['value'] = 1;
2712                    ClassRegistry::init('AchievementStatus')->create();
2713                    ClassRegistry::init('AchievementStatus')->save($as);
2714                    array_push($updated, $achievementId);
2715                } elseif ($as100['AchievementStatus']['value'] != $ac100counter) {
2716                    $as100['AchievementStatus']['value'] = $ac100counter;
2717                    ClassRegistry::init('AchievementStatus')->save($as100);
2718                    array_push($updated, $achievementId);
2719                }
2720            }
2721        }
2722        $updatedCount = count($updated);
2723        for ($i = 0; $i < $updatedCount; $i++) {
2724            $a = ClassRegistry::init('Achievement')->findById($updated[$i]);
2725            $updated[$i] = [];
2726            $updated[$i][0] = $a['Achievement']['name'];
2727            $updated[$i][1] = $a['Achievement']['description'];
2728            $updated[$i][2] = $a['Achievement']['image'];
2729            $updated[$i][3] = $a['Achievement']['color'];
2730            $updated[$i][4] = $a['Achievement']['xp'];
2731            $updated[$i][5] = $a['Achievement']['id'];
2732        }
2733
2734        return $updated;
2735    }
2736
2737    public static function getXPJump($lvl = null): int {
2738        if ($lvl >= 102) {
2739            return 0;
2740        }
2741        if ($lvl == 101) {
2742            return 1150;
2743        }
2744        if ($lvl == 100) {
2745            return 50000;
2746        }
2747        if ($lvl >= 70) {
2748            return 150;
2749        }
2750        if ($lvl >= 40) {
2751            return 100;
2752        }
2753        if ($lvl >= 20) {
2754            return 50;
2755        }
2756        if ($lvl >= 12) {
2757            return 25;
2758        }
2759
2760        return 10;
2761    }
2762
2763    public static function updateXP($userID, $achievementData): void {
2764        $xpBonus = 0;
2765        $aCount = count($achievementData);
2766        for ($i = 0; $i < $aCount; $i++) {
2767            $xpBonus += $achievementData[$i][4];
2768        }
2769        if ($xpBonus == 0) {
2770            return;
2771        }
2772        $user = ClassRegistry::init('User')->findById($userID);
2773        $user['User']['xp'] = $xpBonus;
2774        Level::checkLevelUp($user['User']);
2775        ClassRegistry::init('User')->save($user);
2776    }
2777
2778    public static function getPartitionRange($amountRemaining, $collectionSize, $partition) {
2779        if ($collectionSize > 0) {
2780            $amountPartitions = ceil($amountRemaining / $collectionSize);
2781        } else {
2782            return ['0', $collectionSize - 1];
2783        }
2784        if ($collectionSize > 0 && $amountRemaining % $collectionSize == 0) {
2785            return [ $partition * $collectionSize,  $partition * $collectionSize + $collectionSize - 1];
2786        }
2787        $amountCounter = 0;
2788        $amountFrom = 0;
2789        $amountTo = $collectionSize - 1;
2790        while ($amountRemaining > $collectionSize) {
2791            if ($partition == $amountCounter) {
2792                break;
2793            }
2794            $amountRemaining -= $collectionSize;
2795            $amountCounter++;
2796            $amountFrom += $collectionSize;
2797            $amountTo += $collectionSize;
2798        }
2799        $amountTo = $amountFrom + $collectionSize - 1;
2800        if ($partition >= $amountPartitions - 1) {
2801            $amountTo = $amountFrom + $amountRemaining - 1;
2802        }
2803        $a = [];
2804        $a[0] = $amountFrom;
2805        $a[1] = $amountTo;
2806
2807        return $a;
2808    }
2809
2810    /**
2811     * @param int $uid User ID
2812     * @return void
2813     */
2814    protected function handleSearchSettings($uid) {
2815        $this->loadModel('UserContribution');
2816        $uc = $this->UserContribution->find('first', ['conditions' => ['user_id' => $uid]]);
2817        if ($uc == null) {
2818            $uc = [];
2819            $uc['UserContribution']['user_id'] = $uid;
2820            $uc['UserContribution']['added_tag'] = 0;
2821            $uc['UserContribution']['created_tag'] = 0;
2822            $uc['UserContribution']['made_proposal'] = 0;
2823            $uc['UserContribution']['reviewed'] = 0;
2824            $uc['UserContribution']['score'] = 0;
2825            $this->UserContribution->create();
2826            $this->UserContribution->save($uc);
2827        }
2828        new TsumegoFilters();
2829    }
2830
2831    protected function signIn(array $user): void {
2832        Auth::init($user);
2833        $vs = $this->TsumegoStatus->find('first', ['conditions' => ['user_id' => $user['User']['id']], 'order' => 'updated DESC']);
2834        if ($vs) {
2835            $this->Session->write('lastVisit', $vs['TsumegoStatus']['tsumego_id']);
2836        }
2837        $this->Session->write('texture', $user['User']['texture']);
2838        $this->Session->write('check1', $user['User']['id']);
2839    }
2840
2841    public function beforeFilter(): void {
2842        $this->loadModel('User');
2843        $this->loadModel('Activate');
2844        $this->loadModel('Tsumego');
2845        $this->loadModel('TsumegoRatingAttempt');
2846        $this->loadModel('Set');
2847        $this->loadModel('TimeModeAttempt');
2848        $this->loadModel('TsumegoStatus');
2849        $this->loadModel('Comment');
2850        $this->loadModel('TsumegoAttempt');
2851        $this->loadModel('AdminActivity');
2852        $this->loadModel('Achievement');
2853        $this->loadModel('AchievementStatus');
2854        $this->loadModel('AchievementCondition');
2855        $this->loadModel('SetConnection');
2856        $this->loadModel('Tag');
2857        $this->loadModel('TagName');
2858        $this->loadModel('Favorite');
2859
2860        Auth::init();
2861        $timeMode = new TimeMode();
2862
2863        $highscoreLink = 'highscore';
2864        $lightDark = 'light';
2865        $resetCookies = false;
2866        $levelBar = 1;
2867        $lastProfileLeft = 1;
2868        $lastProfileRight = 2;
2869        $hasFavs = false;
2870
2871        if (Auth::isLoggedIn()) {
2872            if (isset($_COOKIE['addTag']) && $_COOKIE['addTag'] != 0 && $this->Session->read('page') != 'set') {
2873                $newAddTag = explode('-', $_COOKIE['addTag']);
2874                $tagId = $newAddTag[0];
2875                $newTagName = $this->TagName->find('first', ['conditions' => ['name' => str_replace($tagId . '-', '', $_COOKIE['addTag'])]]);
2876                if ($newTagName) {
2877                    $saveTag = [];
2878                    $saveTag['Tag']['tag_name_id'] = $newTagName['TagName']['id'];
2879                    $saveTag['Tag']['tsumego_id'] = $tagId;
2880                    $saveTag['Tag']['user_id'] = Auth::getUserID();
2881                    $saveTag['Tag']['approved'] = 0;
2882                    $this->Tag->save($saveTag);
2883                }
2884                $this->set('removeCookie', 'addTag');
2885            }
2886            if (isset($_COOKIE['z_sess']) && $_COOKIE['z_sess'] != 0
2887            && strlen($_COOKIE['z_sess']) > 5) {
2888                Auth::getUser()['_sessid'] = $_COOKIE['z_sess'];
2889                Auth::saveUser();
2890            }
2891            if (Auth::getUser()['lastHighscore'] == 1) {
2892                $highscoreLink = 'highscore';
2893            } elseif (Auth::getUser()['lastHighscore'] == 2) {
2894                $highscoreLink = 'rating';
2895            } elseif (Auth::getUser()['lastHighscore'] == 3) {
2896                $highscoreLink = 'leaderboard';
2897            } elseif (Auth::getUser()['lastHighscore'] == 4) {
2898                $highscoreLink = 'highscore3';
2899            }
2900
2901            if (isset($_COOKIE['lastMode']) && $_COOKIE['lastMode'] != 0) {
2902                Auth::getUser()['lastMode'] = $_COOKIE['lastMode'];
2903                Auth::saveUser();
2904            }
2905            if (isset($_COOKIE['sound']) && $_COOKIE['sound'] != '0') {
2906                Auth::getUser()['sound'] = $_COOKIE['sound'];
2907                Auth::saveUser();
2908                unset($_COOKIE['sound']);
2909            }
2910            $this->set('ac', true);
2911            $this->set('user', Auth::getUser());
2912        }
2913
2914        if (isset($_COOKIE['lightDark']) && $_COOKIE['lightDark'] != '0') {
2915            $lightDark = $_COOKIE['lightDark'];
2916            if (Auth::isLoggedIn()) {
2917                // Convert string to integer for database storage
2918                $lightDarkInt = ($lightDark === 'light') ? 0 : 2;
2919                Auth::getUser()['lastLight'] = $lightDarkInt;
2920            }
2921        } elseif (Auth::isLoggedIn()) {
2922            if (Auth::getUser()['lastLight'] == 0
2923            || Auth::getUser()['lastLight'] == 1) {
2924                $lightDark = 'light';
2925            } else {
2926                $lightDark = 'dark';
2927            }
2928        }
2929
2930        if (Auth::isLoggedIn()) {
2931            $this->handleSearchSettings(Auth::getUserID());
2932            if (isset($_COOKIE['levelBar']) && $_COOKIE['levelBar'] != '0') {
2933                $levelBar = $_COOKIE['levelBar'];
2934                Auth::getUser()['levelBar'] = $levelBar;
2935            } elseif (Auth::getUser()['levelBar'] == 0
2936          || Auth::getUser()['levelBar'] == 'level') {
2937                $levelBar = 1;
2938            } else {
2939                $levelBar = 2;
2940            }
2941
2942            if (isset($_COOKIE['lastProfileLeft']) && $_COOKIE['lastProfileLeft'] != '0') {
2943                $lastProfileLeft = $_COOKIE['lastProfileLeft'];
2944                Auth::getUser()['lastProfileLeft'] = $lastProfileLeft;
2945            } else {
2946                $lastProfileLeft = Auth::getUser()['lastProfileLeft'];
2947                if ($lastProfileLeft == 0) {
2948                    $lastProfileLeft = 1;
2949                }
2950            }
2951            if (isset($_COOKIE['lastProfileRight']) && $_COOKIE['lastProfileRight'] != '0') {
2952                $lastProfileRight = $_COOKIE['lastProfileRight'];
2953                Auth::getUser()['lastProfileRight'] = $lastProfileRight;
2954            } else {
2955                $lastProfileRight = Auth::getUser()['lastProfileRight'];
2956                if ($lastProfileRight == 0) {
2957                    $lastProfileRight = 1;
2958                }
2959            }
2960        }
2961        $mode = 1;
2962        if (isset($_COOKIE['mode']) && $_COOKIE['mode'] != '0') {
2963            if ($_COOKIE['mode'] == 1) {
2964                $mode = 1;
2965            } else {
2966                $mode = 2;
2967            }
2968        }
2969
2970        if (Auth::isLoggedIn() && Auth::getUser()['mode'] == 2) {
2971            $mode = 2;
2972        }
2973
2974        if ($_COOKIE['sprint'] != 1) {
2975            $this->updateSprintCondition();
2976        }
2977        $correctSolveAttempt = false;
2978
2979        if (Auth::isLoggedIn()) {
2980            if (isset($_COOKIE['revelation']) && $_COOKIE['revelation'] != 0) {
2981                Auth::getUser()['revelation'] -= 1;
2982            }
2983
2984            if (!$this->request->is('ajax')) {
2985                $this->PlayResultProcessor->checkPreviousPlay($timeMode);
2986            }
2987
2988            if (isset($_COOKIE['noScore']) && isset($_COOKIE['noPreId'])) {
2989                if ($_COOKIE['noScore'] != '0' && $_COOKIE['noPreId'] != '0') {
2990                    //$previosTsumegoX = $this->Tsumego->findById($_COOKIE['noPreId']);
2991                    //$previosTsumegoXsc = $this->SetConnection->find('first', array('conditions' => array('tsumego_id' => $_COOKIE['noPreId'])));
2992                    //$scoreArrX = explode('-', $this->decrypt($_COOKIE['noScore']));
2993
2994                    $utPreX = $this->TsumegoStatus->find('first', ['conditions' => ['tsumego_id' => $_COOKIE['noPreId'], 'user_id' => Auth::getUserID()]]);
2995                    if ($utPreX == null) {
2996                        $utPreX['TsumegoStatus'] = [];
2997                        $utPreX['TsumegoStatus']['user_id'] = Auth::getUserID();
2998                        $utPreX['TsumegoStatus']['tsumego_id'] = $_COOKIE['noPreId'];
2999                    }
3000                    if ($utPreX['TsumegoStatus']['status'] == 'W') {
3001                        $utPreX['TsumegoStatus']['status'] = 'C';
3002                    } else {
3003                        $utPreX['TsumegoStatus']['status'] = 'S';
3004                    }
3005                    $utPreX['TsumegoStatus']['created'] = date('Y-m-d H:i:s');
3006                    //$this->TsumegoStatus->save($utPreX);
3007                    //$sessionUts = $this->Session->read('loggedInUser.uts');
3008                    /*if (!$sessionUts) {
3009                    $sessionUts = [];
3010                    }
3011                    $sessionUts[$utPreX['TsumegoStatus']['tsumego_id']] = $utPreX['TsumegoStatus']['status'];
3012                    $this->Session->write('loggedInUser.uts', $sessionUts);*/
3013                }
3014            }
3015        }
3016        $boardNames = [];
3017        $enabledBoards = [];
3018        $boardPositions = [];
3019
3020        $boardNames[1] = 'Pine';
3021        $boardNames[2] = 'Ash';
3022        $boardNames[3] = 'Maple';
3023        $boardNames[4] = 'Shin Kaya';
3024        $boardNames[5] = 'Birch';
3025        $boardNames[6] = 'Wenge';
3026        $boardNames[7] = 'Walnut';
3027        $boardNames[8] = 'Mahogany';
3028        $boardNames[9] = 'Blackwood';
3029        $boardNames[10] = 'Marble 1';
3030        $boardNames[11] = 'Marble 2';
3031        $boardNames[12] = 'Marble 3';
3032        $boardNames[13] = 'Tibet Spruce';
3033        $boardNames[14] = 'Marble 4';
3034        $boardNames[15] = 'Marble 5';
3035        $boardNames[16] = 'Quarry 1';
3036        $boardNames[17] = 'Flowers';
3037        $boardNames[18] = 'Nova';
3038        $boardNames[19] = 'Spring';
3039        $boardNames[20] = 'Moon';
3040        $boardNames[21] = 'Apex';
3041        $boardNames[22] = 'Gold 1';
3042        $boardNames[23] = 'Amber';
3043        $boardNames[24] = 'Marble 6';
3044        $boardNames[25] = 'Marble 7';
3045        $boardNames[26] = 'Marble 8';
3046        $boardNames[27] = 'Marble 9';
3047        $boardNames[28] = 'Marble 10';
3048        $boardNames[29] = 'Jade';
3049        $boardNames[30] = 'Quarry 2';
3050        $boardNames[31] = 'Black Bricks';
3051        $boardNames[32] = 'Wallpaper 1';
3052        $boardNames[33] = 'Wallpaper 2';
3053        $boardNames[34] = 'Gold & Gray';
3054        $boardNames[35] = 'Gold & Pink';
3055        $boardNames[36] = 'Veil';
3056        $boardNames[37] = 'Tiles';
3057        $boardNames[38] = 'Mars';
3058        $boardNames[39] = 'Pink Cloud';
3059        $boardNames[40] = 'Reptile';
3060        $boardNames[41] = 'Mezmerizing';
3061        $boardNames[42] = 'Magenta Sky';
3062        $boardNames[43] = 'Tsumego Hero';
3063        $boardNames[44] = 'Pretty';
3064        $boardNames[45] = 'Hunting';
3065        $boardNames[46] = 'Haunted';
3066        $boardNames[47] = 'Carnage';
3067        $boardNames[48] = 'Blind Spot';
3068        $boardNames[49] = 'Giants';
3069        $boardNames[50] = 'Gems';
3070        $boardNames[51] = 'Grandmaster';
3071        $boardPositions[1] = [1, 'texture1', 'black34.png', 'white34.png'];
3072        $boardPositions[2] = [2, 'texture2', 'black34.png', 'white34.png'];
3073        $boardPositions[3] = [3, 'texture3', 'black34.png', 'white34.png'];
3074        $boardPositions[4] = [4, 'texture4', 'black.png', 'white.png'];
3075        $boardPositions[5] = [5, 'texture5', 'black34.png', 'white34.png'];
3076        $boardPositions[6] = [6, 'texture6', 'black.png', 'white.png'];
3077        $boardPositions[7] = [7, 'texture7', 'black34.png', 'white34.png'];
3078        $boardPositions[8] = [8, 'texture8', 'black.png', 'white.png'];
3079        $boardPositions[9] = [9, 'texture9', 'black.png', 'white.png'];
3080        $boardPositions[10] = [10, 'texture10', 'black34.png', 'white34.png'];
3081        $boardPositions[11] = [11, 'texture11', 'black34.png', 'white34.png'];
3082        $boardPositions[12] = [12, 'texture12', 'black34.png', 'white34.png'];
3083        $boardPositions[13] = [13, 'texture13', 'black34.png', 'white34.png'];
3084        $boardPositions[14] = [14, 'texture14', 'black34.png', 'white34.png'];
3085        $boardPositions[15] = [15, 'texture15', 'black.png', 'white.png'];
3086        $boardPositions[16] = [16, 'texture16', 'black34.png', 'white34.png'];
3087        $boardPositions[17] = [17, 'texture17', 'black34.png', 'white34.png'];
3088        $boardPositions[18] = [18, 'texture18', 'black.png', 'white.png'];
3089        $boardPositions[19] = [19, 'texture19', 'black34.png', 'white34.png'];
3090        $boardPositions[20] = [20, 'texture20', 'black34.png', 'white34.png'];
3091        $boardPositions[21] = [33, 'texture33', 'black34.png', 'white34.png'];
3092        $boardPositions[22] = [21, 'texture21', 'black.png', 'whiteKo.png'];
3093        $boardPositions[23] = [22, 'texture22', 'black34.png', 'white34.png'];
3094        $boardPositions[24] = [34, 'texture34', 'black.png', 'white.png'];
3095        $boardPositions[25] = [35, 'texture35', 'black34.png', 'white34.png'];
3096        $boardPositions[26] = [36, 'texture36', 'black.png', 'white.png'];
3097        $boardPositions[27] = [37, 'texture37', 'black34.png', 'white34.png'];
3098        $boardPositions[28] = [38, 'texture38', 'black38.png', 'white34.png'];
3099        $boardPositions[29] = [39, 'texture39', 'black.png', 'white.png'];
3100        $boardPositions[30] = [40, 'texture40', 'black34.png', 'white34.png'];
3101        $boardPositions[31] = [41, 'texture41', 'black34.png', 'white34.png'];
3102        $boardPositions[32] = [42, 'texture42', 'black34.png', 'white42.png'];
3103        $boardPositions[33] = [43, 'texture43', 'black34.png', 'white42.png'];
3104        $boardPositions[34] = [44, 'texture44', 'black34.png', 'white34.png'];
3105        $boardPositions[35] = [45, 'texture45', 'black34.png', 'white42.png'];
3106        $boardPositions[36] = [47, 'texture47', 'black34.png', 'white34.png'];
3107        $boardPositions[37] = [48, 'texture48', 'black34.png', 'white34.png'];
3108        $boardPositions[38] = [49, 'texture49', 'black.png', 'white.png'];
3109        $boardPositions[39] = [50, 'texture50', 'black34.png', 'white34.png'];
3110        $boardPositions[40] = [51, 'texture51', 'black34.png', 'white34.png'];
3111        $boardPositions[41] = [52, 'texture52', 'black34.png', 'white34.png'];
3112        $boardPositions[42] = [53, 'texture53', 'black34.png', 'white34.png'];
3113        $boardPositions[43] = [54, 'texture54', 'black54.png', 'white54.png'];
3114        $boardPositions[44] = [23, 'texture23', 'black.png', 'whiteFlower.png'];
3115        $boardPositions[45] = [24, 'texture24', 'black24.png', 'white24.png'];
3116        $boardPositions[46] = [25, 'texture25', 'blackGhost.png', 'white.png'];
3117        $boardPositions[47] = [26, 'texture26', 'blackInvis.png', 'whiteCarnage.png'];
3118        $boardPositions[48] = [27, 'texture27', 'black27.png', 'white27.png'];
3119        $boardPositions[49] = [28, 'texture28', 'blackGiant.png', 'whiteKo.png'];
3120        $boardPositions[50] = [29, 'texture29', 'blackKo.png', 'whiteKo.png'];
3121        $boardPositions[51] = [30, 'texture55', 'blackGalaxy.png', 'whiteGalaxy.png'];
3122
3123        $boardCount = 51;
3124
3125        if ($this->Session->check('texture') || (isset($_COOKIE['texture']) && $_COOKIE['texture'] != '0')) {
3126            $splitCookie = [];
3127            if (isset($_COOKIE['texture']) && $_COOKIE['texture'] != '0') {
3128                $splitCookie = str_split($_COOKIE['texture']);
3129                $textureCookies = $_COOKIE['texture'];
3130                Auth::getUser()['texture'] = $this->Session->read('texture');
3131                $this->Session->write('texture', $_COOKIE['texture']);
3132                $this->set('textureCookies', $textureCookies);
3133            } else {
3134                if (Auth::isLoggedIn()) {
3135                    $this->Session->write('texture', Auth::getUser()['texture']);
3136                }
3137                $textureCookies = $this->Session->read('texture');
3138                $splitTextureCookies = str_split($textureCookies);
3139                $splitTextureCookiesCount = count($splitTextureCookies);
3140                for ($i = 0; $i < $splitTextureCookiesCount; $i++) {
3141                    if ($splitTextureCookies[$i] == 2) {
3142                        $enabledBoards[$i + 1] = 'checked';
3143                    } else {
3144                        $enabledBoards[$i + 1] = '';
3145                    }
3146                }
3147            }
3148
3149            $splitCookieCount = count($splitCookie);
3150            for ($i = 0; $i < $splitCookieCount; $i++) {
3151                if ($splitCookie[$i] == 2) {
3152                    $enabledBoards[$i + 1] = 'checked';
3153                } else {
3154                    $enabledBoards[$i + 1] = '';
3155                }
3156            }
3157            if (Auth::isLoggedIn()) {
3158                Auth::saveUser();
3159            }
3160        }
3161
3162        if (!$this->Session->check('texture')) {
3163            $this->Session->write('texture', '222222221111111111111111111111111111111111111111111');
3164            $enabledBoards[1] = 'checked';
3165            $enabledBoards[2] = 'checked';
3166            $enabledBoards[3] = 'checked';
3167            $enabledBoards[4] = 'checked';
3168            $enabledBoards[5] = 'checked';
3169            $enabledBoards[6] = 'checked';
3170            $enabledBoards[7] = 'checked';
3171            $enabledBoards[8] = 'checked';
3172            $enabledBoards[9] = '';
3173            $enabledBoards[10] = '';
3174            $enabledBoards[11] = '';
3175            $enabledBoards[12] = '';
3176            $enabledBoards[13] = '';
3177            $enabledBoards[14] = '';
3178            $enabledBoards[15] = '';
3179            $enabledBoards[16] = '';
3180            $enabledBoards[17] = '';
3181            $enabledBoards[18] = '';
3182            $enabledBoards[19] = '';
3183            $enabledBoards[20] = '';
3184            $enabledBoards[21] = '';
3185            $enabledBoards[22] = '';
3186            $enabledBoards[23] = '';
3187            $enabledBoards[24] = '';
3188            $enabledBoards[25] = '';
3189            $enabledBoards[26] = '';
3190            $enabledBoards[27] = '';
3191            $enabledBoards[28] = '';
3192            $enabledBoards[29] = '';
3193            $enabledBoards[30] = '';
3194            $enabledBoards[31] = '';
3195            $enabledBoards[32] = '';
3196            $enabledBoards[33] = '';
3197            $enabledBoards[34] = '';
3198            $enabledBoards[35] = '';
3199            $enabledBoards[36] = '';
3200            $enabledBoards[37] = '';
3201            $enabledBoards[38] = '';
3202            $enabledBoards[39] = '';
3203            $enabledBoards[40] = '';
3204            $enabledBoards[41] = '';
3205            $enabledBoards[42] = '';
3206            $enabledBoards[43] = '';
3207            $enabledBoards[44] = '';
3208            $enabledBoards[45] = '';
3209            $enabledBoards[46] = '';
3210            $enabledBoards[47] = '';
3211            $enabledBoards[48] = '';
3212            $enabledBoards[49] = '';
3213            $enabledBoards[50] = '';
3214            $enabledBoards[51] = '';
3215        }
3216        $achievementUpdate = [];
3217        if ($this->Session->check('initialLoading')) {
3218            $achievementUpdate1 = $this->checkLevelAchievements();
3219            $achievementUpdate2 = $this->checkProblemNumberAchievements();
3220            $achievementUpdate3 = $this->checkRatingAchievements();
3221            $achievementUpdate4 = $this->checkTimeModeAchievements();
3222            $achievementUpdate5 = $this->checkDanSolveAchievements();
3223            $achievementUpdate = array_merge(
3224                $achievementUpdate1 ?: [],
3225                $achievementUpdate2 ?: [],
3226                $achievementUpdate3 ?: [],
3227                $achievementUpdate4 ?: [],
3228                $achievementUpdate5 ?: []
3229            );
3230            $this->Session->delete('initialLoading');
3231        }
3232
3233        if (count($achievementUpdate) > 0) {
3234            $this->updateXP(Auth::getUserID(), $achievementUpdate);
3235        }
3236
3237        $nextDay = new DateTime('tomorrow');
3238        if (Auth::isLoggedIn()) {
3239            Auth::getUser()['name'] = $this->checkPicture(Auth::getUser());
3240            $this->set('user', Auth::getUser());
3241        }
3242        $this->set('mode', $mode);
3243        $this->set('nextDay', $nextDay->format('m/d/Y'));
3244        $this->set('boardNames', $boardNames);
3245        $this->set('enabledBoards', $enabledBoards);
3246        $this->set('boardPositions', $boardPositions);
3247        $this->set('highscoreLink', $highscoreLink);
3248        $this->set('achievementUpdate', $achievementUpdate);
3249        $this->set('lightDark', $lightDark);
3250        $this->set('levelBar', $levelBar);
3251        $this->set('lastProfileLeft', $lastProfileLeft);
3252        $this->set('lastProfileRight', $lastProfileRight);
3253        $this->set('resetCookies', $resetCookies);
3254        $this->set('hasFavs', $hasFavs);
3255    }
3256
3257    public function afterFilter() {}
3258}